Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
29.03.2015, 13:04     Как приостановить doInBackground() из AsyncTask #2
Нету такого, используй еще один AsyncTask.
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
19.04.2015, 12:52  [ТС]     Как приостановить doInBackground() из AsyncTask #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 в фоновом потоке, а потом снова запустить главный поток, тем самым запустив активити юзер интерфейса?
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
19.04.2015, 15:14     Как приостановить doInBackground() из AsyncTask #4
Прав. Можно запускать ProductsViewActivity из AsyncTask или использовать callback метод (есть темы на форуме).
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
19.04.2015, 17:00  [ТС]     Как приостановить doInBackground() из AsyncTask #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 .........................
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
24.04.2015, 16:29  [ТС]     Как приостановить doInBackground() из AsyncTask #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, если бы он был один. Или создать класс-обертку для этих двух параметров?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
24.04.2015, 16:43     Как приостановить doInBackground() из AsyncTask #7
предлагаю сделать 2 asynctask, и запускать второй из PostExecute первого
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
25.04.2015, 14:07  [ТС]     Как приостановить doInBackground() из AsyncTask #8
AsyncTask дает спагетти-код...

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

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

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

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

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

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

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

Добавлено через 5 минут
аа, его можно просто сворачивать?
fgtmenow
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 254
27.04.2015, 11:35     Как приостановить doInBackground() из AsyncTask #19
ох, ладно. совсем тебя запутал наверное.

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

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

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

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

Кто-то сначала комментариями описывает структуру класса (как набросок), а потом реализовывает. кто-то (как я) сначала пишет код, потом подчищает, структурирует и комментирует.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2015, 11:38     Как приостановить doInBackground() из AsyncTask
Еще ссылки по теме:
Как написать простейший запрос на сервер без использование AsyncTask Android
Android Как реализовать Синхронное выполнение двух функций при вызове AsyncTask
Android Как поставить поставить AsyncTask на паузу?
AsyncTask Android
AsyncTask Android

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

Или воспользуйтесь поиском по форуму:
lihusha
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 67
27.04.2015, 11:38  [ТС]     Как приостановить doInBackground() из AsyncTask #20
я понял. эти тэги дают возможность просто свернут кусок кода, чтобы было видно только lable, который сам называешь.
Yandex
Объявления
27.04.2015, 11:38     Как приостановить doInBackground() из AsyncTask
Ответ Создать тему
Опции темы

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