同步处理资料任务的Android

问题描述:

在我的应用程序有多个地方的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的东西,否则跳过,因为它已经运行。

可能更容易只使用由单一工作线程支持的操作队列。这样所有任务将按照他们收到的顺序运行。您可以通过使用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... 
     } 
    }); 
}