4

私はほとんどの時間Asynctaskを使用していますが、現在のアプリではダウンロードされたデータが大きすぎるため、バックグラウンドダウンロードを行うために他にどのような方法を使用できるか、ハンドラーがこの目的であるかどうかは実際にはわかりません。

4

2 に答える 2

9

しかし、現在のアプリではダウンロードしたデータが大きすぎるため、バックグラウンドでダウンロードするために使用できる他の方法はありますか?

doInBackground長いタスクに正確に使用される方法であるため、私はあなたのタイトルに同意しません. 非常AsyncTaskに強力なツールであり、タイプ セーフでもあります。

しかし、別の解決策もあります。
もう 1 つのクリーンで効率的な方法は、IntentServicewith を使用することResultReceiverです。

で使用する場合IntentServiceResultReceiver、基本的な例を次に示します


から拡張するクラスを作成するだけでIntentService、そのメソッドを実装する必要がありますonHandleIntent

protected void onHandleIntent(Intent intent) {  
   String urlLink = intent.getStringExtra("url");
   ResultReceiver receiver = intent.getParcelableExtra("receiver");
   InputStream input = null;
   long contentLength;
   long total = 0;
   int downloaded = 0;
   try {
      URL url = new URL(urlLink);
      HttpURLConnection con = (HttpURLConnection) url.openConnection();
      // ...
      Bundle data = new Bundle();
      data.putInt("progress", (int) (total * 100 / contentLength));
      receiver.send(PROGRESS_UPDATE, data);
   }
   //...
}

そしてonReceiveResultfromの実装ResultReceiver:

@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
   super.onReceiveResult(resultCode, resultData);
   if (resultCode == DownloadService.PROGRESS_UPDATE) {
      int progress = resultData.getInt("progress");
      pd.setProgress(progress);
      pd.setMessage(String.valueOf(progress) + "% was downloaded sucessfully.");
   }
}

Service使い始めに

Intent i = new Intent(this, DownloadService.class);
i.putExtra("url", <data>); // extra additional data
i.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(i);

だからIntentServiceあなたの仕事をして、

receiver.send(PROGRESS_UPDATE, data);

更新の進行状況に関する情報を送信するだけですUI

注:ただし、 IntentServiceとResultReceiverの詳細を参照してください

于 2012-06-23T10:43:21.670 に答える
1

簡単な提案:

  1. データが独立している場合、複数の AsyncTask を実行できます。
  2. onProgressUpdate() メソッドを利用できます。
于 2012-06-23T10:39:51.947 に答える