2010-12-02 3 views
8

Androidでダウンロードキューを実装するにはどうすればよいですか?Androidでキューをダウンロードする

ほとんどの作業を行う可能性のあるいくつかのプラットフォームクラスがあると思われます。

答えて

17

Androidでダウンロードキューを実装するにはどうすればよいですか?

IntentServiceを使用してください。キューとバックグラウンドスレッドが用意されているので、ダウンロードロジックをonHandleIntent()に入れてください。これを実証するSee here for a sample project

+1

アメージング:

は、あなたがシャットダウン時にこれをダウン呼んでいることを確認してください!ありがとうCommonsWare! – hpique

+0

Hello Commonsware、上記のmetionの例はダウンロードキューではありません。バックグラウンドで画像をダウンロードするだけです。ダウンロードするイメージが20枚あればどうなりますか? –

+1

@chrish: "上記のmetionの例はダウンロードキューではありません" - そうです。私はちょうどそれを一度呼び出すことが起こる。 「ダウンロードする画像が20枚あればどうなるでしょうか?」 - 'IntentService'が何をダウンロードするのかを知るために必要な情報を' startService() 'で20回呼び出します。 1つのコマンドが処理されている間、他のコマンドは 'IntentService'の内部にキューイングされ、それらの順番を待っています。複数のスレッドを持つダウンロードキューをキューから使いたい場合は、 'ThreadPoolExecutor'を使用する独自の' Service'を作成し、キューが空になったら 'stopSelf()'を呼び出します。 – CommonsWare

2

私はjava.util.concurrentパッケージを見て、より具体的にあなたが一度に「N」のRunnableオブジェクトの数を実行しますExecutorServiceのを作成することができますExecutors

をよく読んで、自動的にキューに入れを示唆しています残りのタスクを実行します。実行中のスレッドの1つが実行を終了すると、キュー内の次のRunnableオブジェクトが実行のためにピックアップされます。

2

IntentServiceを使用すると、キャンセルをサポートすることが非常に困難になります。それはあなたが知っておく必要があるものです。可能であれば、APIレベル9の方が使いやすくなりますhttp://developer.android.com/reference/android/app/DownloadManager.html

+0

DownloadManagerはファイルをキュー単位でダウンロードしますか? –

1

API 11以降では、非同期タスクでFixedThreadPoolを使用することをお勧めします。一度行う:

ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(3); 

ここで、3は同時に実行するダウンロード数です。既に3つのダウンロードが実行されている場合はタスクをキューに入れ、後でそのタスクを自動的に処理します。使用して非同期タスクを起動 :

yourAsynTask.executeOnExecutor(threadPoolExecutor, params); 

paramsがおそらく接続したいURLです。あなたはあなたのasynctaskのonPostExecuteでそれを読んで、HttpURLConnectionを使ってサーバに接続することができます。

threadPoolExecutor.shutdown() 
関連する問題