2014-03-28 51 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(); 
     } 
    } 
};