2012-07-26 67 views
0

在我的應用程序有多個地方的AsyncTask可以調用連接到網絡,下載的東西,等它可以從活動或後臺服務。同步處理資料任務的Android

有各種問題,因爲我在讀取和寫入SQLite數據庫並在多個任務上的類似操作重疊(假設GetMail在後臺運行,用戶手動啓動它)。

我想syncronize類型的這一任務,並寫了這樣的代碼。我不知道如何測試它,它似乎是正常運行,但我希望得到你的意見,如果它是有效的。這裏

public enum AsyncTasks 
{ 
    GetMail, 
    PostMail, 
} 
public class MyApplication extends Application 
{ 
    private final ArrayList<AsyncTasks> mLockedAsyncTasks = new ArrayList<AsyncTasks>(); 


    public boolean lockAsyncTask(AsyncTasks task) 
    { 
     synchronized (mLockedAsyncTasks) 
     { 
      if (!mLockedAsyncTasks.contains(task)) 
      { 
       mLockedAsyncTasks.add(task); 
       return true; 
      } 

      return false;    
     }   
    } 

    public void unlockAsyncTask(AsyncTasks task) 
    { 
     synchronized (mLockedAsyncTasks) 
     { 
      if (mLockedAsyncTasks.contains(task)) 
      { 
       mLockedAsyncTasks.remove(task); 
      } 
     } 
    } 
} 

的想法是,我打電話lockAsyncTask如果成功 - 我開始與HTTP的東西,否則跳過,因爲它已經運行。

回答

1

可能更容易只使用由單一工作線程支持的操作隊列。這樣所有任務將按照他們收到的順序運行。您可以通過使用Executors工廠方法輕鬆完成此操作。這裏有一個簡單的例子:

private static final ExecutorService mThreadPool = 
     Executors.newSingleThreadExecutor(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mThreadPool.execute(new Runnable() { 
     public void run() { 
      // Do some work here... 
     } 
    }); 

    mThreadPool.execute(new Runnable() { 
     public void run() { 
      // Do some additional work here after 
      // the first Runnable has finished... 
     } 
    }); 
}