私のアプリケーションでは、AsyncTaskを呼び出して、Webに接続したり、ダウンロードしたりすることができる場所が複数あります。これは、Activityまたはバックグラウンドサービスから行うことができます。
SQLiteデータベースの読み取りと書き込みを行っているため、および同様の操作で複数のタスクが重複している場合(たとえば、GetMailがバックグラウンドで実行され、ユーザーが手動で開始した場合)、さまざまな問題が発生します。
このタスクの種類を同期させて、このようなコードを記述したいと思います。テスト方法がわからないので、問題なく動作しているようですが、有効かどうかご意見を伺いたいと思います。
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を続行します。それ以外の場合は、すでに実行されているためスキップします。