Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
1

Как приостановить doInBackground() из AsyncTask

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

Author24 — интернет-сервис помощи студентам
Здравствуйте.

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

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

Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2015, 17:56
Ответы с готовыми решениями:

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

Java.lang.RuntimeException: An error occurred while executing doInBackground()
ХЗ из за чего это кто может это расшифровать ? FATAL EXCEPTION: AsyncTask #3 Process:...

Как остановить AsyncTask?
Не ругайтесь на код:) с Asynctask работаю только несколько дней class MyTask extends...

Как приостановить процесс
Здравствуйте, уважаемые участники форума! У меня задача такая, подскажите,пожалуйста, как можно с...

22
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
29.03.2015, 13:04 2
Нету такого, используй еще один AsyncTask.
1
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
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
19.04.2015, 15:14 4
Прав. Можно запускать ProductsViewActivity из AsyncTask или использовать callback метод (есть темы на форуме).
1
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
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
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 256
24.04.2015, 16:43 7
предлагаю сделать 2 asynctask, и запускать второй из PostExecute первого
1
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
25.04.2015, 14:07  [ТС] 8
AsyncTask дает спагетти-код...

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

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

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

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

Добавлено через 43 секунды
плюс классы можно можно делить на регионы, погугли эту тему
1
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
26.04.2015, 12:53  [ТС] 16
Цитата Сообщение от fgtmenow Посмотреть сообщение
плюс классы можно можно делить на регионы, погугли эту тему
погуглил, вот [ru.stackoverflow запрещен]

как по мне, это получится то же самое, что класс-наследник asynctask вынести в отдельный файл.

Или
делить на регионы
имеется в виду другое?
0
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 256
27.04.2015, 09:31 17
Java
1
2
3
4
        //<editor_fold desc="Region 1">
             some code here
 
        //</editor_fold>
попробуй вот такую штуку
1
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
27.04.2015, 11:33  [ТС] 18
Цитата Сообщение от fgtmenow Посмотреть сообщение
попробуй вот такую штуку
хоть убей, в сети тоже не могу найти что потом с этим делать...

Добавлено через 5 минут
аа, его можно просто сворачивать?
0
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 256
27.04.2015, 11:35 19
ох, ладно. совсем тебя запутал наверное.

Регион - это способ разделить код большого класса на некие группы, и сворачивать их в редакторе. для больших классов - это одно из решений.

От больших классов, особенно в задачах, где есть массивные вычисления - не уйти. И дабы все это было удобочитаемо, и понятно заменяющему тебя разработчику - надо делать как можно более подробные и понятные комментарии, описание классов, методов, параметров.

по твоей задаче: тебе надо сделать вложенный класс AsyncTask, а все расчеты вынести в другой класс.

Тогда у тебя не будет и нагромождения внутри activity, и весь код будет более менее структурирован. Но в любом случае приучай себя писать комментарии. это очень важная привычка для разработчика.

Кто-то сначала комментариями описывает структуру класса (как набросок), а потом реализовывает. кто-то (как я) сначала пишет код, потом подчищает, структурирует и комментирует.
1
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
27.04.2015, 11:38  [ТС] 20
я понял. эти тэги дают возможность просто свернут кусок кода, чтобы было видно только lable, который сам называешь.
0
27.04.2015, 11:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2015, 11:38
Помогаю со студенческими работами здесь

Как приостановить цикл?
нужно сделать чтобы каждая итерация в цикле происходила после нажатия пользователем кнопки(можно на...

как приостановить программу?
имеется необходимость приостановить работу программы либо средствами биоса, либо иными средствами,...

Как приостановить поток?
var I: Integer; begin Thread := sSpinEdit2.Value; for I := 0 to Thread do begin ...

Как приостановить программу?
Как сделать приостановку программы? Sleep это не то, оно полностью останавливает программу, а мне...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru