Страница 1 из 3

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

Добавлено: 17 июн 2012, 23:00
damager82
В этом уроке:
- используем третий параметр
- используем метод get для получения результата


Click here to read this article!

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

Добавлено: 24 янв 2013, 16:51
$01ny$hko
У меня вот такой код для отправки запроса на сервер.

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

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, я просто его распарсивала и всё. Здесь впала в ступор - не понимаю как же вытащить результат, который приходит без пары ключ-значение? В каком месте его вылавливать и как потом вставить в тело смс-сообщения??

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

Добавлено: 25 янв 2013, 13:27
Volha
Если не ошибаюсь, то как-то так ;)

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

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" );
        }

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

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

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

Добавлено: 07 мар 2013, 22:28
rezak90
делаете асинктаск иннер классом которому будут доступны все локальные переменные вашей активити вот в посте и присваивайте результат.

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

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

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

Добавлено: 10 мар 2013, 21:32
rezak90
ну тогда ивент ему кидайте на вход, а после в посте дёргайте его

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

Добавлено: 10 мар 2013, 23:38
Finch
Я свой listener просто реализую и все.

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

Добавлено: 10 мар 2013, 23:41
rezak90
ну я же о чём, ивент асинктаску и дёргать его

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

Добавлено: 11 мар 2013, 16:19
lacabomba
А можно вкратце, как реализовать

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

Добавлено: 11 мар 2013, 20:38
Finch
lacabomba, вкратце не получится, пора паттерны подучить немного ;)
Wiki

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

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

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

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

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

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

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

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

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

Добавлено: 17 мар 2013, 21:23
rezak90
это понты, не факт что андроид придаст этому потоку высший приоритет чем остальные, в некоторых случаях да, а в некоторых нет, но в любом случае эта строка не помешает

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

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

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

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

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

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

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

Добавлено: 02 май 2013, 01:57
rezak90
так вы используете метод get? или просто запускаете?

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

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

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

Добавлено: 02 май 2013, 15:25
rezak90
показывайте код, иначе это гадания на кофейной гуще