Урок 88. AsyncTask. Итоговый результат. Метод get
Урок 88. AsyncTask. Итоговый результат. Метод get
В этом уроке:
- используем третий параметр
- используем метод get для получения результата
Click here to read this article!
- используем третий параметр
- используем метод get для получения результата
Click here to read this article!
Последний раз редактировалось damager82 20 май 2017, 20:11, всего редактировалось 4 раза.
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
У меня вот такой код для отправки запроса на сервер.
Когда приходил Json, я просто его распарсивала и всё. Здесь впала в ступор - не понимаю как же вытащить результат, который приходит без пары ключ-значение? В каком месте его вылавливать и как потом вставить в тело смс-сообщения??
Код: Выделить всё
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" );
}
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Если не ошибаюсь, то как-то так

Код: Выделить всё
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
Несколько дней копаю так и не понял. Зачем вообще нужен асинктакс, если метод get() блокирует поток, в котором запущен. Мне нужен класс, который что то берет на входе что то там делает в своем потоке и азад отдает в основной. Кроме метода get() я так понимаю забрать никак не получится
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
делаете асинктаск иннер классом которому будут доступны все локальные переменные вашей активити вот в посте и присваивайте результат.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Хехе
Дак вся соль, в том что я хотел класс, который не зависит от всяких вьюшек и прочего, работает с чистыми данными. Вон, например, json'ы забирать. Ты ему url - он тебе распарсенный json.

Re: Урок 88. AsyncTask. Итоговый результат. Метод get
ну тогда ивент ему кидайте на вход, а после в посте дёргайте его
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Я свой listener просто реализую и все.
CEO of a company R.id.team
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
ну я же о чём, ивент асинктаску и дёргать его
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
А можно вкратце, как реализовать
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
CEO of a company R.id.team
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
При единичных запросах использовать Observer - это жестко или жестоко

Все-таки лучше реализовать отдельный interface и просто вешать на него слушателя.
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Тут реализовывал свой AsyncTask для запросов в интернет и натолкнулся на возможность его ускорить. В самом начале метода doInBackground необходимо добавить следующую строку:
Может кому пригодится.
Код: Выделить всё
// Повышаем приоритет потока.
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND + android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
Может кому пригодится.

Re: Урок 88. AsyncTask. Итоговый результат. Метод get
это понты, не факт что андроид придаст этому потоку высший приоритет чем остальные, в некоторых случаях да, а в некоторых нет, но в любом случае эта строка не помешает
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Вопрос такой. Допустим в методе onclick() я создаю и запускаю не одну а несколько задач одновременно (то есть одну за другой без задержек) и сразу получаю в логе сразу несколько сообщений "Begin". Тем не менее задачи завершаются не одновременно, а каждая следующая завершается через пять секунд после окончания предыдущей. Интересно почему так происходит
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
сколько задач и какая версия Андроида?spheros писал(а):Вопрос такой. Допустим в методе onclick() я создаю и запускаю не одну а несколько задач одновременно (то есть одну за другой без задержек) и сразу получаю в логе сразу несколько сообщений "Begin". Тем не менее задачи завершаются не одновременно, а каждая следующая завершается через пять секунд после окончания предыдущей. Интересно почему так происходит
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Версия Андроида 4.0.3. Запускаю три задачи. Причем сначала для каждой задачи использовал одну и ту же переменную как и в примере - mt. Затем решил создать отдельную переменную для каждой задачи. Результат тот же самый - стартуют одновременно, но завершаются как и прежде - каждая следующая задача завершается через 5 секунд после завершения предыдущей
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
так вы используете метод get? или просто запускаете?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
Просто создавал три задачи MyTask, запускал их одновременно и ждал. После чего получал вышеописанное. Решил поступить так - в конструктор MyTask передавать номер задачи, чтобы отследить по логам выполнение. В метод doInBackground в самое начало добавил строчку Log.d LOG_TAG, "я задача " + такая то ; Запустил все три задачи без задержек одну за другой. Во всех трех одновременно сработал onPreExecute, однако doInBackground() каждой следующей задачи не запускается пока не закончится предыдущая задача. Почему так? Ведь по идее создано и запущено три независимые задачи.
Re: Урок 88. AsyncTask. Итоговый результат. Метод get
показывайте код, иначе это гадания на кофейной гуще
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена