0

多くのバックグラウンド操作を実行する必要があるアプリを作成しています。

  • 30個の類似したJSONから次々にデータをダウンロードします。
  • ユーザーの応答に応じて、上記のダウンロードの優先度/順序を変更します。
  • ユーザーの要求に応じて複数の画像を並行してダウンロードする
  • スレッドの停止/スレッドのステータスの確認など。

上記の操作を実行するのに最適なクラス/APIはどれですか。私は使用してきましたがAsyncTask、デフォルトで10のバックグラウンド操作の制限があり、機能の制限を超えていることをどこかで読みました。

また、上記のタスクを達成するためのコードの平和を共有していただければ幸いです。

4

2 に答える 2

2

ThreadPoolを使用したい

ThreadPool は管理されたスレッドのグループであり、キューに置かれた一連の割り当てられたタスクを並行して実行するのを待っています。

Java は、単純な固定サイズのプールから、効率を最大化するためにワークロードに基づいて動的に拡張するプールまで、プールを管理する多くの方法を提供します。

典型的なパターンは、android が UI スレッドで実行したくないすべてのタスク (例: ネットワーク操作) にスレッドプールを使用することです。ただし、ほとんどの場合、スレッドは結果を UI に投稿する必要がありますが、これは UI スレッドの外部からは防止されます。これは、スレッド プールを作成する方法です。

ExecutorService threadExecutor = Executors.newFixedThreadPool( 3 );
threadExecutor.execute(new Runnable(){
    public void run(){
        //put here your network code
        //when you get the result, either use
        //view.post(new Runnable...);
        //or
        //AsynchTask
   }
});

必要に応じて、さまざまな目的で複数のスレッド プールを使用できますが、一般に、Android について言えば、アクティブなスレッドの総数を低く抑えることをお勧めします。

ハードウェアによっては、コアあたり 2 スレッドが推奨されますが、これは IO バウンド (ネットワークなど) と CPU バウンド (グラフィックスなど) のアクティビティの比率によって異なります。

キュー内のエントリに優先順位を付けるには、 http: //www.javamex.com/tutorials/threads/thread_pools_queues.shtml のように独自の ThreadPoolExecutor を作成し、代わりに PriorityQueue を渡すことをお勧めします。

BlockingQueue q = new PriorityQueue<Runnable>();
ThreadPoolExecutor ex = new ThreadPoolExecutor(4, 10, 20, TimeUnit.SECONDS, q);

関連項目: ThreadPoolExecutor とカスタム タスクを使用して PriorityBlockingQueue を実装する方法

于 2012-11-05T10:52:50.720 に答える
0

はい、スレッド プールは優れたソリューションです。しかし、なぜそれを自分で行うのですか?私は sourceforge.net でオープン ソース プロジェクトを管理しています。この記事も紹介として書きました: Android でのスレッドの管理

于 2012-11-05T14:03:10.070 に答える