Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Как запустить процесс в фоне/отдельным потоком?

#java #android #многопоточность


Сабж.
Произвожу парсинг страницы и добавляю некие элементы парсинга в ListView.
Процесс занимает ~1-2 секунды. 
Так вот, в этот промежуток, ~1-2секунды, все приложение никак не реагирует (виснет,
пока все элементы не будут добавлены в листвью).
Вопрос:
как этого избежать?    


Ответы

Ответ 1



Вам повезло, что процесс парсинга у вас занимает 1-2 секунды. Если бы 5 то система показала бы ANR-диалог. Вообще категорически нельзя в UI-потоке делать какие-то "длинные" вычисления (работа с БД, работа с сетью, whatever...), вообще. Теперь по вопросу: вам поможет внедрение AsyncTask-ов. Подробнее можно почитать здесь

Ответ 2



Сам парсинг занимает столько или добавление? Или у Вас добавление идет в процессе парсинга? Если элементов много лучше создать adapter и вычислять элементы списка когда они понядобятся. Либо вычислить массив в потоке, потом его передать через ArrayAdapter в ListView. По поводу потоков, объявляем класс наследник Thread, перекрываем метод run(). дальше в основном потоке создаем экземпляр и запускаем start(). Пока поток не отработает можно вывести диалог please wait. В документации по андроиду есть примеры с потоками, да и в сети их полно...

Ответ 3



Возможный вариант - это запуск службы: public class CustomService extends IntentService { public CustomService () { super("CustomService"); } public CustomService(String name) { super(name); } @Override protected void onHandleIntent(Intent arg0) { // TODO: Выполнить длительную работу } } и где-то в коде Intent i = new Intent(this, CustomService.class); startService(i);

Комментариев нет:

Отправить комментарий