2017-01-16 7 views
0

У меня есть AsyncTask, которая в настоящее время работает только один раз и занимает около 5-30 секунд для завершения.Периодически запускать AsyncTask после завершения предыдущей задачи

То, что я хочу сделать, это:

1. Запустите приложение
2. Запустите Task
3. Дождитесь ее завершения.
4. Дождитесь фиксированного количества времени, например. 5 секунд
5. Повторите Шаг 2.

Я огляделась несколько постов, которые предполагают, используя Handlers и это, как я пытался сделать это:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     final Activity activity = this; 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 

       // Start AsyncTask 
       new MyTask(activity).execute(); 
      } 
     }, 5000); //Every 5 seconds 
    } 

MyTask является подклассом AsyncTask в какой-нибудь другой .java файл.

Выполнение этой задачи выполняется только при запуске после задержки 5 секунд. Он не перерабатывает себя так, как должен.

Обратите внимание, что я хочу запустить следующую задачу только в том случае, если она еще не запущена и запустить ее через 5 секунд после нее.

Итак, почему он не работает как исключенный?

+0

привет CPX, да, решение это использовать работоспособной и обработчик, но не делают, вместо этого используйте ScheduledThreadPoolExecutor, он безопасен и был разработан с учетом хорошей производительности для Android. https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html –

ответ

1

Попробуйте снова поместить код вашего обработчика в метод onPostExecute для AsyncTask. Таким образом, как только он закончится, он будет ждать 5 секунд, чтобы снова запустить себя.

надеюсь, что это помогает;)

0

Вот как я использую мой код для запуска вызова метода ListDevices каждый раз, когда DELAY.

private ScheduledFuture<?> scheduledFutureListDevices 

private void startListDevicesTaskAtRate(int rate) { 

Runnable runnable = this::requestListDeviceService; 

scheduledFutureListDevices = scheduledThreadPoolExecutor.scheduleWithFixedDelay(runnable, DELAY, rate, TimeUnit.SECONDS); 

Log.d(TAG, "STARTING LIST DEVICES TASK AT " + (rate == Constants.FAST_RATE ? " FAST " : " NORMAL ") + " RATE"); 

if (scheduledFutureListDevices != null) { 
    scheduledFutureListDevices.cancel(false); 
} 

Runnable runnable = this::requestListDeviceService; 

scheduledFutureListDevices = scheduledThreadPoolExecutor.scheduleWithFixedDelay(runnable, DELAY, rate, 
     TimeUnit.SECONDS); 
} 

Я задаю результат scheduledThreadPoolExecutor.scheduleWithFixedDelay к scheduledFutureListDevices так что вы можете отменить его или Resumen везде, где вам нужно

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

  • Нет связанных вопросов^_^