-1

時々複数の画像をダウンロードする必要があるアプリを設計しています。ただし、ダウンロード要求を送信するたびに、複数のスレッドを生成するのではなく、単一のスレッドにキューイングする必要があります。

詳細な解決策を教えていただければ幸いです。ありがとう !

4

4 に答える 4

2

その方法を見ていきますExecutors.newFixedThreadPool()。これはスレッドプールを作成します。スレッドプールは、関数で渡す大きな数と同じ数のスレッドのみを一度に実行します。1 を渡すと、一度に 1 つのスレッドのみが実行されるため、ダウンロードは順番に実行されますが、「別の」スレッドで実行されます。

このメソッドで作成した後は、そのメソッド内に/ExecutorServiceを渡すだけで、それが実行されます。終わったら忘れずに。RunnableCallablesubmit()shutdown()

于 2013-01-25T06:24:47.427 に答える
1

独自のキューを作成して、すべての画像リクエストをそこに置くことができます。android AsyncTask を使用しますが、前のタスクが終了した後にのみ新しいタスクを開始します (トリッキーな方法)。

または、エグゼキューター サービスを作成してイメージを順次ダウンロードします (難しい方法で、車輪の再発明)。

または、android 用の github で ImageDownloader を見つけます。シングルスレッドのダウンロードをサポートするものがいくつかあります。こちらは人気です。(簡単な方法)

PS Android AsyncTask を順次実行できますが、API 11 以降でサポートされています。

于 2013-01-25T06:53:57.557 に答える
0

Metova Android SDKには、 というクラスがありThreadPoolWorkerます。とまったく同じように機能AsyncTaskしますが、オブジェクトをパラメーターとして受け取るコンストラクターがあり、ThreadPool1 つのスレッドに制限できます。ThreadPoolオブジェクトはさまざまなオブジェクト間で再利用でき、ThreadPoolWorkerそれぞれTheadPoolWorkerdoInBackgroundメソッドは基本的に開始された順序で実行されます。

簡単な例を次に示します。

private static final ThreadPool THREAD_POOL = new ThreadPool(1);

private void executeSomeWorkers() {

    new MyThreadPoolWorker().execute("Jimmy");
    new MyThreadPoolWorker().execute("Bobby");
    new MyThreadPoolWorker().execute("Ronny");
}

private class MyThreadPoolWorker extends ThreadPoolWorker<String, Void, Object> {

    public MyThreadPoolWorker() {

        super(THREAD_POOL);
    }

    @Override
    protected Object doInBackground(String... params) {

        // Fun background stuff goes here!
    }
}
于 2013-01-25T06:46:51.333 に答える
0

アクティビティで設計している場合は、executor を使用してスレッドを処理し、それらを管理する AsyncTask を使用できます。サービスを使用している場合は、単一のスレッドでファイルを 1 つずつダウンロードするだけで、一定時間非アクティブになった後、またはエラーが発生した後にスレッドを中断して再起動します。

于 2013-01-25T06:25:24.650 に答える