@Morn

Как создать бесконечный цикл в Android?

Как лучше организовать бесконечный фоновый цикл в Android?

Пробовал такую конструкцию с помощью AsyncTask, но она имеет серьезный недостаток: никакие другие фоновые процессы не могу выполняться пока работает цикл.

class loop extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        while(true) {
            //Некоторые действия
        }
    }
}


P.S. Это будет программа, которая управляет устройством (таймлапс слайдером) на основе Arduino.
Раньше я это делал в Processing с его стандартным циклом draw(). В цикле программа:
1) Реагировала на разрыв соединения.
2) Реагировала на полученные от Arduino сообщения.
3) Обновляла таймер обратного отсчета и индикатор процесса (ProgressBar).
  • Вопрос задан
  • 4991 просмотр
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Расскажите всю задачу. Возможно в вашем приложении имеется серьезный архитектурный недостаток, исправив который, вы избавитесь от необходимости использования цикла такого рода.
Ответ написан
anyd3v
@anyd3v
То как вы продемонстрировали делать нельзя, тк вылезет ошибка (не помню точно текст, но что то вроде: слишком долго работает бекграунд таск). Сталкнулся с этим когда достался легаси проект и проедидущий разработчик так работал с комет сервером.

на счет "никакие другие фоновые процессы не могу выполняться пока работает цикл." вы скорее всего не правильно запускаете таск: в зависимости от версии надо запускать или просто через excecute или через AsynkTask.runOnExcecutor

Как вариант решения описнного мной выше и вашего подхода вы можете сделать так: Запустить таск, дождаться выполнения запусмтить по новой со следующей "порцией" данных или следующем запросом на сервер
Ответ написан
Master255
@Master255
Использую такую конструкцию (не знаю на сколько она правильна):
new Transfer(t + "/", false).start();
synchronized (th)
{
try
{
th.wait();//th - это private static Thread th; th = Thread.currentThread();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
Это что бы запустить новую ветку и ждать в основной.
Затем возврат уже в новой ветке так:
synchronized (th)
{
th.notify();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы