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

Работа с AsyncTask - Android

Восстановить пароль Регистрация
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
18.09.2013, 09:35     Работа с AsyncTask #1
Попробовал использовать AsyncTask и возник вопрос.
У меня есть несколько ф-й, которые парсят текстовые файлы и заполняют таблицы БД.
Сейчас они выполняются в одном потоке (последовательность выполнения не важна):
LoadData1();
LoadData2();
LoadData3();
LoadData4();
LoadData5();
Но как теперь разместить эти ф-ции в отдельном потоке?
В голову приходит только два варианта. Или создавать столько классов AsyncTask, сколько у меня ф-й заполнения или пихать всё содержимое этих ф-й в один doInBackground().
Ни то, ни другое мне не нравится. Наверное еще можно выполнять все ф-ции из doInBackground(), но тогда вызывать publishProgress() можно будет только между ними.
Может есть более удобный способ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 09:35     Работа с AsyncTask
Посмотрите здесь:

Android AsyncTask+CheckBox
Android Exception в AsyncTask
Android AsyncTask
Android AsyncTask и get()
AsyncTask Android
Android Отмена AsyncTask
AsyncTask и SQLite Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
verylazy
Заблокирован
18.09.2013, 09:47     Работа с AsyncTask #2
Цитата Сообщение от Slon747 Посмотреть сообщение
Ни то, ни другое мне не нравится.
почему?
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
18.09.2013, 09:51  [ТС]     Работа с AsyncTask #3
Цитата Сообщение от verylazy Посмотреть сообщение
почему?
Очень громоздко
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
18.09.2013, 10:25     Работа с AsyncTask #4
каждую функцию выполняйте в отдельном doInBackground, чтоб небыло громоздко создайте менеджер:
Вот отличная статья
http://habrahabr.ru/post/114570/
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
18.09.2013, 10:26     Работа с AsyncTask #5
Создайте один asynctask и последовательно выполняйте каждую функцию в новом экзепляре асинха.
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
18.09.2013, 13:25  [ТС]     Работа с AsyncTask #6
Цитата Сообщение от Gabberr Посмотреть сообщение
каждую функцию выполняйте в отдельном doInBackground, чтоб небыло громоздко создайте менеджер:
Вот отличная статья
http://habrahabr.ru/post/114570/
Цитата Сообщение от haribo Посмотреть сообщение
Создайте один asynctask и последовательно выполняйте каждую функцию в новом экзепляре асинха.
Спасибо. Почитаю и попробую.

Добавлено через 2 часа 54 минуты
Попробовал я сделать с помощью AsyncTaskManager по статье http://habrahabr.ru/post/114570/.
Скачал пример и применил у себя.
По идее данный код должен выполнить процедуру decompressFromZip() в отдельном потоке:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
// Create manager and set this activity as context and listener
mAsyncTaskManager = new AsyncTaskManager(this, this);
// Handle task that can be retained before
mAsyncTaskManager.handleRetainedTask(getLastNonConfigurationInstance());
}
 
public void onRunButtonClick(View view) {
         //Create and run task and progress dialog
        mAsyncTaskManager.setupTask(new Task(decompressFromZip()));
    }
Но выполняется в след. порядке:
decompressFromZip() в основном потоке
Task()
doInBackground()

Скажите, что может быть не так?
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
18.09.2013, 13:36     Работа с AsyncTask #7
Потому что вы на вход подаете функцию, сперва она выполняется в основном потоке, потом создается новый таск.
Измените конструктор класса Task, и в зависимости от того что подали на вход таску - в doInBackgroung выполняйте одну из своих функций.
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
18.09.2013, 15:15  [ТС]     Работа с AsyncTask #8
Цитата Сообщение от Gabberr Посмотреть сообщение
Потому что вы на вход подаете функцию, сперва она выполняется в основном потоке, потом создается новый таск.
Измените конструктор класса Task, и в зависимости от того что подали на вход таску - в doInBackgroung выполняйте одну из своих функций.
Понял. Спасибо.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
18.09.2013, 15:29     Работа с AsyncTask #9
в карму если можно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 09:06     Работа с AsyncTask
Еще ссылки по теме:

AsyncTask Android
Android Работа с потоками (AsyncTask)
Android AsyncTask тормозит
Android Не работает AsyncTask
MainActivity AsyncTask Android

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

Или воспользуйтесь поиском по форуму:
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
19.09.2013, 09:06  [ТС]     Работа с AsyncTask #10
Цитата Сообщение от Gabberr Посмотреть сообщение
в карму если можно
Забыл. Сделал

Добавлено через 1 час 32 минуты
Цитата Сообщение от Gabberr Посмотреть сообщение
Потому что вы на вход подаете функцию, сперва она выполняется в основном потоке, потом создается новый таск.
Измените конструктор класса Task, и в зависимости от того что подали на вход таску - в doInBackgroung выполняйте одну из своих функций.
И всё таки на получается.
Сделал по минимуму:
Java
1
2
3
4
5
mAsyncTaskManager.setupTask(new Task());
 
public Task() {
    MyFunction();
}
MyFunction() выполняется в общем потоке.
Я могу, конечно, положить MyFunction() прямо в doInBackgroung(), но в чем тогда будет преимущество перед классическим использованием AsyncTask я так и не понял.
И еще подскажите пожалуйста, как в этом случае можно сделать вывод % текущего процесса, если цикл у меня в MyFunction()

Добавлено через 15 часов 58 минут
Не подскажете ли, как вызывая функции из doInBackgroung(), показывать процесс работы в процентах, если циклы внутри функций?
Или придется класть всё содержимое ф-й в doInBackgroung()?
Yandex
Объявления
19.09.2013, 09:06     Работа с AsyncTask
Ответ Создать тему
Опции темы

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