Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
#1

Как приостановить doInBackground() из AsyncTask - Программирование Android

28.03.2015, 17:56. Просмотров 1369. Ответов 22
Метки нет (Все метки)

Здравствуйте.

Есть экземпляр AsyncTask и активити с WebView.
AsyncTasd выполняет действия с сетью, передает некий url WebView. WebView загружает станицу авторизации(login-password).
В конце WebView получает код авторизации, который нужно передать снова AsyncTask для продолжения выполнения задач с сетью.

Как на время авторизации(login-password) приостановить выполнение и завершение doInBackground? А потом, после авторизации и передачи данных в AsyncTask снова запустить его выполнение?
Есть ли в AsynkTask некий метод "pause()"?

Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2015, 17:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как приостановить doInBackground() из AsyncTask (Программирование Android):

AsyncTask doInbackground и onPostExecute выполняются параллельно ? - Программирование Android
Привет всем)) колдую на AsyncTask doInBackground и onPostExecute Читал что onPostExecute выполняется всегда после doInBackground, но то...

Как остановить AsyncTask? - Программирование Android
Не ругайтесь на код:) с Asynctask работаю только несколько дней class MyTask extends AsyncTask<Void, Void, Void> { @Override...

Как обновить TextView с AsyncTask? - Программирование Android
private class DownloadFilesTask extends AsyncTask<String, Integer, Long> { protected Long doInBackground(String... urls) { ...

AsyncTask как дождаться окончания - Программирование Android
Всем привет. Ситуация следующая. Есть активити "MyTravelList" со списком, которое после нажатия на кнопку, запускает другое активити...

Как приостановить выполнение приложения? - Программирование Android
Как при определенных условиях приостановить выполнение приложения? protected void onCreate(Bundle savedInstanceState) { ...

Как из AsyncTask Добавить элементы в ListView - Программирование Android
В общем сабж. Используя адаптер как сделать?

22
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
29.03.2015, 13:04 #2
Нету такого, используй еще один AsyncTask.
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
19.04.2015, 12:52  [ТС] #3
Еще одна похожая ситуация.

Есть MainActivity, фрагмент кода
Java
1
productsArray = connector.execute(3).get();
здесь productsArray -- массив объектов. Объект состоит только из полей String, сеттеров и геттеров;
connector -- объект класса, унаследованного от AsyncTask. Он выполняет подключение к web сервису, загрузку данных и формирование массива объектов productsArray.

после вышеуказанной строчки код MainActivity
Java
1
2
3
Intent intent = new Intent(MainActivity.this, ProductsViewActivity.class);
intent.putExtra("productsArray", productsArray);
startActivity(intent);
т.е, нужно полученный массив productsArray передать в другую активити, которая отвечает за user interface.
При запуске получается ошибка

Код
java.lang.IllegalStateException: Could not execute method of the activity
предполагаю, что нужно приостановить выполнение главного потока в MainActivity, пока connector грузит данные.
И, только после того, как массив productsArray сформирован, запускать intent и передавать ему данные.

Прав ли я насчет ошибки, и если да, то как приостановить выполнение главного потока, дождаться выполнения doInBackground в фоновом потоке, а потом снова запустить главный поток, тем самым запустив активити юзер интерфейса?
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
19.04.2015, 15:14 #4
Прав. Можно запускать ProductsViewActivity из AsyncTask или использовать callback метод (есть темы на форуме).
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
19.04.2015, 17:00  [ТС] #5
разобрался. буду пока запускать из onPostExecute()
теперь вопрос в передаче данных

Java
1
2
3
4
5
6
ArrayList<Product> productsArray;
........
 
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle b = new Bundle();
b.putSerializable("productsArray", productsArray);
теперь при попытке
Java
1
intent.putExtras(b);
Код
java.lang.RuntimeException: Parcel: unable to marshal value .........................
0
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
24.04.2015, 16:29  [ТС] #6
С вышесказанным разобрался. При передачей пользовательских объектов между активностями (в моем случае это объект класса Product) класс должен быть implement Parcelable.

Еще вопрос про AsyncTask. Есть класс Connector extends AsyncTask
Он выполняет подключение к сервису и должен вернуть два объекта -- accessToken и service (это объекты библиотеки подключения к сервису -- не суть важно в этом вопросе)
Процесс подключения:
Java
1
2
Connector connector = new Connector();
connector.execute();
Дальше создается объект класса, который использует это подключение -- т.е., параметры accessToken и service.
Java
1
RequestMaker requestMaker = new RequestMaker(accessToken, service);
Вопрос в том, что до завершения выполнения doInBackground в Connector параметры accessToken и service грубо говоря = null и воспользоваться connector.getAccessToken() и connector.getService() до завершения doInBackground() нельзя.

Как приостановить основной поток, чтобы когда создается экземпляр RequestMaker, doInBackground уже выполнился?

Можно было бы вернуть параметр из onPostExecute, если бы он был один. Или создать класс-обертку для этих двух параметров?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
24.04.2015, 16:43 #7
предлагаю сделать 2 asynctask, и запускать второй из PostExecute первого
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
25.04.2015, 14:07  [ТС] #8
AsyncTask дает спагетти-код...

Добавлено через 2 часа 6 минут
doInBackground не может выполняться несколько раз?
если в одном месте запустил
Java
1
connector.execute()
то в другом уже нельзя повторить?
если можно, то как?
0
Pablito
2614 / 2097 / 651
Регистрация: 12.05.2014
Сообщений: 7,347
Завершенные тесты: 1
25.04.2015, 14:10 #9
асинктаск для коротких задач, не нужно там ничего приостанавливать

Чем не угодили обычные Thread ? Как их создавать, приостанавливать и убивать - тем на форуме просто завались.
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
25.04.2015, 14:41  [ТС] #10
Цитата Сообщение от Паблито Посмотреть сообщение
Чем не угодили обычные Thread
их методы могут обновлять UI?
В принципе что лучше?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
26.04.2015, 10:08 #11
повторить можно, создав новый экземпляр AsyncTask'a

new AsyncTask.execute();
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
26.04.2015, 11:03  [ТС] #12
Цитата Сообщение от fgtmenow Посмотреть сообщение
повторить можно, создав новый экземпляр AsyncTask'a
new AsyncTask.execute();
да, так и делаю
приходится передавать в конструктор объекта asynctask ссылку на активити, в которой нужно обновить ui. запутанно как-то...
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
26.04.2015, 12:00 #13
в таких случаях мне кажется проще вложенные классы использовать
1
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
26.04.2015, 12:16  [ТС] #14
Цитата Сообщение от fgtmenow Посмотреть сообщение
в таких случаях мне кажется проще вложенные классы использовать
Согласен, но класс получается сильно объемным. При развитии проекта возвращаюсь через неделю к ранее написанному и приходится тратить время, чтобы вспомнить, за что отвечает метод и как он работает. Это через неделю. А через месяц? Через год?

Или подход неправильный?
0
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 257
26.04.2015, 12:19 #15
комментарии! чем больше - тем проще править старый код + это хороший стиль программирования

Добавлено через 43 секунды
плюс классы можно можно делить на регионы, погугли эту тему
1
26.04.2015, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2015, 12:19
Привет! Вот еще темы с ответами:

Как получить значение String из UI потока в потоке AsyncTask? - Программирование Android
Есть 4 шт. EditText. Нужно получить их значения в потоке AsyncTask. Вот весь мой код package com.examplemy.activity2; ...

Как написать простейший запрос на сервер без использование AsyncTask - Программирование Android
как написать простейший запрос на сервер? без использование AsyncTask. у меня есть локальный сервер который возвращает JSON адрес...

Как реализовать Синхронное выполнение двух функций при вызове AsyncTask - Программирование Android
как сделать так чтобы при нажатии на BUTTON с начало выполнилась функция getSignIns а после удачного выполнения выполнялась ...

Как поставить поставить AsyncTask на паузу? - Программирование Android
У меня есть некоторая проблемка в приложении, нужно поставить AsyncTask на паузу в методе onPause(), когда открывается новое activity. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru