2014-03-28 2 views
0

Я разрабатываю приложение, которое необходимо выполнять сетевые задачи поочередно в определенном порядке и с конкретным временем между каждым исполнением.Выполнение задач фоновой сети циклически при возможности отменить весь цикл

Я попытался реализовать это с помощью AsyncTask и TimerTask.

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

TimerTask работает в некоторой степени, но очень неуклюж. Попытка отменить среднюю операцию TimerTask оказалась довольно сложной, и я постоянно получаю две версии моей задачи. Эта проблема усилилась, когда я попытался разбить TimerTask на пять меньших TimerTasks (по одной для каждой операции, которая должна быть завершена).

Итак, есть ли способ выполнить набор фоновых задач в порядке, с конкретным временем между каждым исполнением?

ответ

0
import java.util.ArrayList; 
import java.util.Collections; 

public class RunnableQueue { 
    ArrayList<Runnable> queue; 
    Runnable[] tasks; 
    boolean cancelled; 
    double tag; 

    public RunnableQueue(Runnable... tasks) { 
     this.tasks = tasks; 
     this.tag = Math.random(); 
     queue = new ArrayList<Runnable>(); 
     Collections.addAll(queue, tasks); 
    } 

    public void add(Runnable r) { 
     queue.add(r); 
    } 

    public double getTag() { 
     return tag; 
    } 

    public void addToFront(Runnable r) { 
     queue.add(0, r); 
    } 

    public void next() { 
     if (queue.size() > 0) { 
      new Thread(queue.get(0)).start(); 
      queue.remove(0); 
     } 
    } 

    public void stop() { 
     cancelled = true; 
     queue.clear(); 
    } 

    public void resume() { 
     if (cancelled) { 
      tag = Math.random(); 
      cancelled = false; 
      Collections.addAll(queue, tasks); 
      next(); 
     } 
    } 

    public boolean isCancelled() { 
     return cancelled; 
    } 
} 

Вот пример Runnable, который будет работать с RunnableQueue:

Runnable queueTester = new Runnable() { 

    @Override 
    public void run() { 
     double tag = executor.getTag(); 

     //do some background stuff here 

     Log.i("RunnableQueue-test", "queueTester complete. Sleeping..."); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     if (executor.isCancelled()) { 
      Log.i(TAG, "Boolean is false. Not continuing."); 
     } else if (executor.getTag() != tag) { 
      Log.i(TAG, "Tag has been updated. Not continuing."); 
     } else { 
      executor.add(this); 
      executor.next(); 
     } 
    } 
}; 
Смежные вопросы