1

ここでAsyncTaskとProgressbarに同様の質問をしました。

私が行っているのは、バックグラウンドのAsyncTaskで2つ以上のファイルのダウンロードを1つずつスケジュールすることです。UIスレッドは、ユーザーの操作に応じて、いつでもこれらのファイルの1つを必要とする場合があります。 UIスレッドが要求したときに完了していません。その特定のファイルのダウンロードの進行状況を表示する必要があります。

特定のファイルのダウンロードのプログレスバーを表示することについて、静かないくつかの答えを見てきました。しかし、私の要件は多少異なります。バックグラウンドで発生するファイルのダウンロードの進行状況を追跡する必要があります。

4

3 に答える 3

1

各ダウンロードは、独自のスレッドで実行する必要があります(1つのファイルが小さい場合、1つのサーバーが速い場合など)。

スレッドを拡張するか、ダウンロード用のURIまたはその他の識別子によってパラメーター化されたランナブルを作成してみてください。それができたら、完了するまで実行される2つのスレッドを呼び出すことができます。UI(プログレスバー)を更新する必要がある場合は、ハンドラーを実装し、スレッドからハンドラーにメッセージを送信する必要があります。例えば

メインアクティビティクラス:

   public static final int UPDATE_PROGRESS_BAR =0; 
   public final Handler uiHander = new Handler(){
         public void handleMessage(Message msg){
            switch(msg.what){
            case UPDATE_PROGRESS_BAR: // Something like this to handle the case of progress bar update
                 int updateAmount = msg.obj;
                 // do something to update prog. bar
                 break;

次に、スレッドでそのメッセージを送信するだけで、ハンドラーへの参照が必要になります

     uiHander.obtainMessage(<activity name>.UPDATE_PROGRESS_BAR,<integer update>).sendToTarget();

非同期タスクの実装がバージョンごとに変更され、両方のダウンロードを並行して実行する場合と実行しない場合があるため、これは最も移植性の高い方法である可能性があります(明らかに必要です)

于 2013-01-22T19:30:35.107 に答える
1

AsyncTask を使用しているため、publishProgress(Progress...) の呼び出し後に UI スレッドで呼び出される onProgressUpdate(Progress...) を使用するオプションがあります。

例えば

 private class DownloadFilesTask extends AsyncTask<File, Integer, Long> {
 protected Long doInBackground(File... file) {
     // This will call onProgressUpdate
     publishProgress((int) ((i / (float) count) * 100));
 }

 // this will be called on the UI thread
 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
 }

AsyncTask を使用していない場合は、Handler を作成し、その方法で UI スレッドにメッセージを投稿できます。

ただし、ファイルのダウンロードについて言及したように、考慮すべき点がいくつかあります(Androidドキュメントから):-

  • デバイスには拡張ファイル用の十分なスペースがない可能性があるため、ダウンロードを開始する前に確認し、十分なスペースがない場合はユーザーに警告する必要があります。
  • ファイルのダウンロードはバックグラウンド サービスで実行する必要があります。これにより、ユーザー インタラクションがブロックされるのを回避し、ダウンロードの完了中にユーザーがアプリを終了できるようになります。
  • 適切に処理する必要がある要求およびダウンロード中に、さまざまなエラーが発生する可能性があります。
  • ダウンロード中にネットワーク接続が変更される可能性があるため、そのような変更を処理し、中断された場合は可能な限りダウンロードを再開する必要があります。
  • ダウンロードはバックグラウンドで行われますが、ダウンロードの進行状況を示し、完了時にユーザーに通知し、選択されたときにユーザーをアプリケーションに戻す通知を提供する必要があります。

幸いなことに、上記のすべては Google のライブラリでカバーされており、進行状況の通知をダウンロードできます (アプリを終了しても)。それを使用することも、必要に応じてソースを変更することもできます。詳細はこちら

http://developer.android.com/google/play/expansion-files.html#AboutLibraries

于 2013-01-22T19:36:38.477 に答える
0

使用できますDownloadManagerが、ビューに進行状況は表示されません。その他のオプションは、カスタムタスクを使用しExecutorServiceて送信することです。送信されたタスクのマップを維持するカスタム クラスにRunnableラップします。ExecutorServiceファイルが必要なときはいつでも、タスクが完了しているかどうかをこのクラスに問い合わせたり、実行中のタスクの ListView を表示したりできます。

于 2013-01-22T20:16:06.117 に答える