0

私のアプリケーションでは、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を続行します。それ以外の場合は、すでに実行されているためスキップします。

4

1 に答える 1

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...
        }
    });
}
于 2012-07-26T19:25:48.947 に答える