Урок 88. AsyncTask. Итоговый результат. Метод get

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение damager82 » 17 июн 2012, 23:00

В этом уроке:
- используем третий параметр
- используем метод get для получения результата


Click here to read this article!
Последний раз редактировалось damager82 20 май 2017, 20:11, всего редактировалось 4 раза.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение $01ny$hko » 24 янв 2013, 16:51

У меня вот такой код для отправки запроса на сервер.

Код: Выделить всё

class GetAsyncTask extends AsyncTask<String, Void, String> {

	
	BufferedReader in = null;
	String page = "Нет данных"; // Заполняем на тот случай если она не измениться в результате ошибки в блоке try

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Log.d("my tag", "начало");

	}

	protected String doInBackground(String... url) {
		try {

			Log.d("myTag", "Отправка данных!!!"); 
			// ))
			HttpClient client = new DefaultHttpClient();
			HttpGet request = new HttpGet();
			request.setURI(new URI(url[0]));
			HttpResponse response = client.execute(request); // посылаем запрос
			in = new BufferedReader(new InputStreamReader(response
					.getEntity().getContent()));
			StringBuffer sb = new StringBuffer(""); // в этом буфере накапливаем данные которые пришли
			String line = "";
			String NL = System.getProperty("line.separator");
			while ((line = in.readLine()) != null) { // здесь ждём пока придут все данные
				sb.append(line + NL);
			}
			in.close();
			page = sb.toString(); // вот строка с результатом
			Log.d("myTag", "Результат запроса: \n" + page); // выводим её в лог

		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return page;
	}// doInBackground

	@Override
	protected void onPostExecute(String result) {
		super.onPostExecute(result);
		Log.d(LOG_TAG, "my tag" );

	}
Когда приходил Json, я просто его распарсивала и всё. Здесь впала в ступор - не понимаю как же вытащить результат, который приходит без пары ключ-значение? В каком месте его вылавливать и как потом вставить в тело смс-сообщения??

Volha
Сообщения: 61
Зарегистрирован: 20 авг 2012, 17:39

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение Volha » 25 янв 2013, 13:27

Если не ошибаюсь, то как-то так ;)

Код: Выделить всё

class GetAsyncTask extends AsyncTask<String, Void, JSONObject> {
        BufferedReader in = null;
        String page = "Нет данных"; // Заполняем на тот случай если она не измениться в результате ошибки в блоке try
        @Override
        protected void onPreExecute() {
                super.onPreExecute();
                Log.d("my tag", "начало");
        }

        protected JSONObject doInBackground(String... url) {
                try {
                        Log.d("myTag", "Отправка данных!!!");
                        // ))
                        HttpClient client = new DefaultHttpClient();
                        HttpGet request = new HttpGet();
                        request.setURI(new URI(url[0]));
                        HttpResponse response = client.execute(request); // посылаем запрос
                        in = new BufferedReader(new InputStreamReader(response
                                        .getEntity().getContent()));
                        StringBuffer sb = new StringBuffer(""); // в этом буфере накапливаем данные которые пришли
                        String line = "";
                        String NL = System.getProperty("line.separator");
                        while ((line = in.readLine()) != null) { // здесь ждём пока придут все данные
                                sb.append(line + NL);
                        }
                        in.close();
                        page = sb.toString(); // вот строка с результатом
                        Log.d("myTag", "Результат запроса: \n" + page); // выводим её в лог
                } catch (URISyntaxException e) {
                        e.printStackTrace();
                } catch (ClientProtocolException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        if (in != null) {
                                try {
                                        in.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                }
                 JSONObject json = new JSONObject(page);
                 return json;
        }// doInBackground
        @Override
        protected void onPostExecute(JSONObject result) {
                super.onPostExecute(result);
                Log.d(LOG_TAG, "my tag" );
        }

lacabomba
Сообщения: 4
Зарегистрирован: 24 фев 2013, 23:21

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение lacabomba » 07 мар 2013, 21:50

Несколько дней копаю так и не понял. Зачем вообще нужен асинктакс, если метод get() блокирует поток, в котором запущен. Мне нужен класс, который что то берет на входе что то там делает в своем потоке и азад отдает в основной. Кроме метода get() я так понимаю забрать никак не получится

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 07 мар 2013, 22:28

делаете асинктаск иннер классом которому будут доступны все локальные переменные вашей активити вот в посте и присваивайте результат.
R.id.team
Политика на форуме запрещена

lacabomba
Сообщения: 4
Зарегистрирован: 24 фев 2013, 23:21

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение lacabomba » 10 мар 2013, 20:42

Хехе :) Дак вся соль, в том что я хотел класс, который не зависит от всяких вьюшек и прочего, работает с чистыми данными. Вон, например, json'ы забирать. Ты ему url - он тебе распарсенный json.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 10 мар 2013, 21:32

ну тогда ивент ему кидайте на вход, а после в посте дёргайте его
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение Finch » 10 мар 2013, 23:38

Я свой listener просто реализую и все.
CEO of a company R.id.team

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 10 мар 2013, 23:41

ну я же о чём, ивент асинктаску и дёргать его
R.id.team
Политика на форуме запрещена

lacabomba
Сообщения: 4
Зарегистрирован: 24 фев 2013, 23:21

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение lacabomba » 11 мар 2013, 16:19

А можно вкратце, как реализовать

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение Finch » 11 мар 2013, 20:38

lacabomba, вкратце не получится, пора паттерны подучить немного ;)
Wiki
CEO of a company R.id.team

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение neoksi » 12 мар 2013, 06:18

Finch писал(а):lacabomba, вкратце не получится, пора паттерны подучить немного ;)
Wiki
При единичных запросах использовать Observer - это жестко или жестоко ;).

Все-таки лучше реализовать отдельный interface и просто вешать на него слушателя.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение neoksi » 17 мар 2013, 21:04

Тут реализовывал свой AsyncTask для запросов в интернет и натолкнулся на возможность его ускорить. В самом начале метода doInBackground необходимо добавить следующую строку:

Код: Выделить всё

		// Повышаем приоритет потока.
		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND + android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);

Может кому пригодится. ;)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 17 мар 2013, 21:23

это понты, не факт что андроид придаст этому потоку высший приоритет чем остальные, в некоторых случаях да, а в некоторых нет, но в любом случае эта строка не помешает
R.id.team
Политика на форуме запрещена

spheros
Сообщения: 11
Зарегистрирован: 29 мар 2013, 18:36

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение spheros » 01 май 2013, 20:56

Вопрос такой. Допустим в методе onclick() я создаю и запускаю не одну а несколько задач одновременно (то есть одну за другой без задержек) и сразу получаю в логе сразу несколько сообщений "Begin". Тем не менее задачи завершаются не одновременно, а каждая следующая завершается через пять секунд после окончания предыдущей. Интересно почему так происходит

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 01 май 2013, 21:28

spheros писал(а):Вопрос такой. Допустим в методе onclick() я создаю и запускаю не одну а несколько задач одновременно (то есть одну за другой без задержек) и сразу получаю в логе сразу несколько сообщений "Begin". Тем не менее задачи завершаются не одновременно, а каждая следующая завершается через пять секунд после окончания предыдущей. Интересно почему так происходит
сколько задач и какая версия Андроида?
R.id.team
Политика на форуме запрещена

spheros
Сообщения: 11
Зарегистрирован: 29 мар 2013, 18:36

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение spheros » 02 май 2013, 00:29

Версия Андроида 4.0.3. Запускаю три задачи. Причем сначала для каждой задачи использовал одну и ту же переменную как и в примере - mt. Затем решил создать отдельную переменную для каждой задачи. Результат тот же самый - стартуют одновременно, но завершаются как и прежде - каждая следующая задача завершается через 5 секунд после завершения предыдущей

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 02 май 2013, 01:57

так вы используете метод get? или просто запускаете?
R.id.team
Политика на форуме запрещена

spheros
Сообщения: 11
Зарегистрирован: 29 мар 2013, 18:36

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение spheros » 02 май 2013, 14:58

Просто создавал три задачи MyTask, запускал их одновременно и ждал. После чего получал вышеописанное. Решил поступить так - в конструктор MyTask передавать номер задачи, чтобы отследить по логам выполнение. В метод doInBackground в самое начало добавил строчку Log.d LOG_TAG, "я задача " + такая то ; Запустил все три задачи без задержек одну за другой. Во всех трех одновременно сработал onPreExecute, однако doInBackground() каждой следующей задачи не запускается пока не закончится предыдущая задача. Почему так? Ведь по идее создано и запущено три независимые задачи.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 88. AsyncTask. Итоговый результат. Метод get

Сообщение rezak90 » 02 май 2013, 15:25

показывайте код, иначе это гадания на кофейной гуще
R.id.team
Политика на форуме запрещена

Ответить