0

Мне нужно запустить кусок кода 10 раз с интервалом в 3 секунды. Кроме того, я хочу запустить это в AsyncTask, потому что я не хочу, чтобы он был привязан к активности. Итак, я сделал это: 1. Начал задачу async из своего основного вида деятельности. 2. Я сделал свою основную деятельность в ожидании завершения задачи async. 3. Я запустил CountDownTimer внутри AsyncTask, чтобы выполнить требуемый фрагмент кода с интервалом в 3 секунды. 4. Мне нужно обновить некоторые элементы пользовательского интерфейса в этом фрагменте кода. Итак, я запускаю эту часть в потоке пользовательского интерфейса.Запуск CountDownTimer внутри AsyncTask

Проблема: Я получаю следующее сообщение об ошибке, как только супер (начальный промежуток, интервал) был назван в моей CountDownTimer:

10-04 08:10:31.775 28124-28146/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #3 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:304) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
      at android.os.Handler.<init>(Handler.java:200) 
      at android.os.Handler.<init>(Handler.java:114) 
      at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114) 
      at android.os.CountDownTimer.<init>(CountDownTimer.java:114) 
+0

Вы должны использовать [планировщик] (http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html) – mbmc

ответ

0

Ошибка само за себя ... doInBackground() работает на фоне который, поскольку он не предназначен для петли, не связан с Looper.

Вы, скорее всего, не хотите напрямую создавать экземпляр обработчика ... любые данные, которые возвращает ваша реализация doInBackground(), будут переданы onPostExecute(), которая выполняется в потоке пользовательского интерфейса.

ДОБАВЛЕНО СЛЕДУЮЩИЙ НА StackTrace появляясь в вопрос:

Похоже, что вы пытаетесь запустить AsyncTask из GL рендеринга нить ... не делать это потому что они не будут когда-либо Looper.loop() или. AsyncTasks действительно предназначены для запуска только из потока пользовательского интерфейса.

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

, например:

private TimerTask mTimerTask; 
private Timer t = new Timer(); 

public void doTimerTask() { 

     mTimerTask = new TimerTask() { 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         callYourMethodHere(); 
         Log.i("TIMER", "TimerTask run"); 
        } 
       }); 
      } 
     }; 

     // public void schedule (TimerTask task, long delay, long period) 
     t.schedule(mTimerTask, 500, 1000); // 

    } 

    public void stopTask() { 

     if (mTimerTask != null) { 
      Log.i("TIMER", "timer canceled"); 
      mTimerTask.cancel(); 
     } 

    } 

Позвольте мне знать, если вы обнаружите какие-то проблемы, комментируя ниже.

+0

Спасибо за ваш ответ. Я хочу иметь async-задачу в моем коде, чтобы задача продолжала работать, даже если приложение было сведено к минимуму пользователем. Будет ли ваше решение работать с аналогичной функциональностью? – Sid

+0

затем вызовите задачу Async в таймере. Сделайте еще одну AsyncTask, а затем поместите нужный код, который нужно запускать каждую минуту, а затем вызывать его по таймеру (посредством его объекта и называть его каждую минуту), который будет запускаться в главной теме. – Sangeeta

+0

Это не решит мою проблему, потому что мне нужен один AsyncTask, который позволит мне запустить этот фрагмент кода, даже если действие прекратится. – Sid

Смежные вопросы