powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / РАбота с потоками
14 сообщений из 14, страница 1 из 1
РАбота с потоками
    #38691254
Фотография Areostar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь пропарсить xml в отделном потоке:
ошибок не получаюю но и результата нет. цифры "1234567" отображаются а xml нет. в чём ощибка?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
package com.andrik.xmlproject;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.*;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity 
{
	TextView tvInfo;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tvInfo = (TextView) findViewById(R.id.myText);
        tvInfo.setText("1234567");
        
        final MyThread thread = new MyThread();
        final Timer timer = new Timer();
        
        TimerTask task = new TimerTask() { 
            public void run() 
            { 
                if(thread.isAlive() == false)
                {
                	timer.cancel();
                	tvInfo.setText(thread.xml);
                }
            } 
        }; 
 
        thread.start();
        timer.schedule( task, 100 );
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    public static class MyThread extends Thread {
    	String xml = null;
        public void run() { 
            try 
            {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost("http://www.boi.org.il/currency.xml");
     
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                xml = EntityUtils.toString(httpEntity);
     
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691397
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, потому что стоило дождаться окончания работы потока, и тогда вывести xml?
https://www.google.com/search?q=Android FutureTask
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691399
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691404
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Areostar,

Timer выполняется один раз с задержкой 100 мс, наверное за такое время нельзя скачать xml.
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691500
Фотография Areostar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDAreostar,

Timer выполняется один раз с задержкой 100 мс, наверное за такое время нельзя скачать xml.

А как мне тогда толовить завершение потока?
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691524
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AreostarА как мне тогда толовить завершение потока?
Используйте штатные средства для запуска фоновых\асинхронных задач, вместо того рукоблудия что у вас. Ссылки привел выше.
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691525
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Areostar0FDAreostar,

Timer выполняется один раз с задержкой 100 мс, наверное за такое время нельзя скачать xml.

А как мне тогда толовить завершение потока?
Например, путем прикручивания http://developer.android.com/intl/ru/reference/android/os/Handler.html

Хотя, я-же советовал прикрутить AsyncTask и чтение XML ]androidannotation. Если есть вопросы, как это сделать, то велкам.
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691526
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanХотя, я-же советовал прикрутить AsyncTask и чтение XML ]androidannotation
Промахнулся малость... AsyncTask и чтение XML
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691527
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Areostar0FDAreostar,

Timer выполняется один раз с задержкой 100 мс, наверное за такое время нельзя скачать xml.

А как мне тогда толовить завершение потока?

Смотри javadoc, у Timer есть 3-й параметр период, это если про таймер. А зачем ждать завершение потока, лучше смотри ссылки, которые дал Blazkowicz, особенно AsyncTask.
И еще, в твоем MyThread.run, если будет исключение, xml=null и тоже не покажет xml.
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691532
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AreostarА как мне тогда толовить завершение потока?
Нужно, сначала понять как оно должно работать. "Отловить" завершение фонового потока в UI Thread, не блокируя сам UI Thread нельзя. Поэтому, вполне логично, что действия "по зовершению" выполнения потока, нужно вызывать из самого потока.
Но так как, UI нельзя менять в этом потоке, то нужен Callback, который будет работать после завершения вашего потока, но внутри UI потока.

Это всё подробно расписано по ссылкам, которые я приваш выше. Если с английским тяжко, ищите аналогичные статьи в рунете.
Про андроид их как грязи:
https://www.google.com/search?q=многопоточность андроид
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691536
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНо так как, UI нельзя менять в этом потоке, то нужен Callback, который будет работать после завершения вашего потока, но внутри UI потока.
Это делается через http://developer.android.com/intl/ru/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691542
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЭто делается через http://developer.android.com/intl/ru/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

Спасибо, кэп. Это и называется callback. Я, в отличие от ТС, документацию читать умею.
http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691581
Фотография Areostar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попорядку.

Подобные примеры читал пытался использовать но непонимяю следущего:

1)protected
Код: java
1.
Void doInBackground(String... urls)

Джаву только начал учить и не понимаю что может озночать ... в параметрах функции

2)Как я понял работу с потоками надо в отдельныйласс выделять?

3)откуда надозапускать поток? Из protected Void doInBackground(String... urls) ? Или ещё откуда?

4) Где и как отслеживать его завершение
...
Рейтинг: 0 / 0
РАбота с потоками
    #38691594
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Areostar1)protected
Код: java
1.
Void doInBackground(String... urls)

Джаву только начал учить и не понимаю что может озночать ... в параметрах функции

varargs
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html
синтаксический сахар для возможности указания переменного числа аргументов метода.

Areostar2)Как я понял работу с потоками надо в отдельныйласс выделять?

И, благодаря синтаксису Java, даже не один класс.

Areostar3)откуда надозапускать поток? Из protected Void doInBackground(String... urls) ? Или ещё откуда?

По хорошему, не надо запускать поток. Надо взять инструменты, которые это делают за вас. А doInBackground должен вызывать ваш долгоиграющий метод. Что, собственно, следуюет из названия.

Areostar4) Где и как отслеживать его завершение
Пока вы будете пытаться "отслеживать". У вас ничего не выйдет. Не надо ничего "отслеживать". Надо в конце, или после вашего долгоиграющего метода, вызывать действия, которые вы хотите произвести с результатом: tvInfo.setText(xml);

Вы принципиально отказываетесь читать статьи по теме?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / РАбота с потоками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]