Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / РАбота с потоками / 14 сообщений из 14, страница 1 из 1
09.07.2014, 00:21
    #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
09.07.2014, 08:50
    #38691397
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РАбота с потоками
Наверное, потому что стоило дождаться окончания работы потока, и тогда вывести xml?
https://www.google.com/search?q=Android FutureTask
...
Рейтинг: 0 / 0
09.07.2014, 08:51
    #38691399
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РАбота с потоками
...
Рейтинг: 0 / 0
09.07.2014, 08:57
    #38691404
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РАбота с потоками
Areostar,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4) Где и как отслеживать его завершение
...
Рейтинг: 0 / 0
09.07.2014, 11:06
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / РАбота с потоками / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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