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

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

Войти
Регистрация
Восстановить пароль
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 438
#1

Работа с AsyncTask - Программирование Android

18.09.2013, 09:35. Просмотров 892. Ответов 9
Метки нет (Все метки)

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

Работа с потоками (AsyncTask) - Программирование Android
Здравствуйте. Мне нужно отослать post запрос на сервер, но так как грузить GUI нельзя (что и логично) - обволакиваю весь код работы с...

AsyncTask и get() - Программирование Android
Создаю асинхронный процесс, где в onPreExecute() запускаю анимированный ProgressDialog. После выполнения задачи нужно выполнить действия....

AsyncTask - Программирование Android
Здравствуйте, при использовании двух одинаковых методов получается разный результат. AsyncTask в одном случае успешно передает данные в...

AsyncTask - Программирование Android
Использую AsyncTasc class MyT extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void......

AsyncTask - Программирование Android
Привет. Знаю, что в AsyncTask doInBackground() обращатся к компонентам UI нельзя. Когда я пытаюсь обновить вывод (в EditText) в...

AsyncTask и Jsoup - Программирование Android
Не работает вот такой код: package com.example.projecta; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import...

9
verylazy
Заблокирован
18.09.2013, 09:47 #2
Цитата Сообщение от Slon747 Посмотреть сообщение
Ни то, ни другое мне не нравится.
почему?
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 438
18.09.2013, 09:51  [ТС] #3
Цитата Сообщение от verylazy Посмотреть сообщение
почему?
Очень громоздко
0
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
18.09.2013, 10:25 #4
каждую функцию выполняйте в отдельном doInBackground, чтоб небыло громоздко создайте менеджер:
Вот отличная статья
http://habrahabr.ru/post/114570/
1
haribo
41 / 41 / 3
Регистрация: 26.05.2013
Сообщений: 160
18.09.2013, 10:26 #5
Создайте один asynctask и последовательно выполняйте каждую функцию в новом экзепляре асинха.
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 438
18.09.2013, 13:25  [ТС] #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()

Скажите, что может быть не так?
0
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
18.09.2013, 13:36 #7
Потому что вы на вход подаете функцию, сперва она выполняется в основном потоке, потом создается новый таск.
Измените конструктор класса Task, и в зависимости от того что подали на вход таску - в doInBackgroung выполняйте одну из своих функций.
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 438
18.09.2013, 15:15  [ТС] #8
Цитата Сообщение от Gabberr Посмотреть сообщение
Потому что вы на вход подаете функцию, сперва она выполняется в основном потоке, потом создается новый таск.
Измените конструктор класса Task, и в зависимости от того что подали на вход таску - в doInBackgroung выполняйте одну из своих функций.
Понял. Спасибо.
0
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
18.09.2013, 15:29 #9
в карму если можно
1
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 438
19.09.2013, 09:06  [ТС] #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()?
0
19.09.2013, 09:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 09:06
Привет! Вот еще темы с ответами:

MainActivity AsyncTask - Программирование Android
Добрый вечер. Ребята тут небольшая проблема. Мне нужно Заполнить NavigatorDrawer (из базы). Почему когда я пытаюсь в...

Не работает AsyncTask - Программирование Android
Не работает AsyncTask , вот код: private void registerInBackground() { new AsyncTask() { @Override ...

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

AsyncTask+CheckBox - Программирование Android
Здравствуйте, интересует вопрос нужно в функцию AsyncTask послать несколько строк, в зависимости какие Чекбоксы чекнуты. Ну например: ...


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

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

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