私はほとんどの時間Asynctaskを使用していますが、現在のアプリではダウンロードされたデータが大きすぎるため、バックグラウンドダウンロードを行うために他にどのような方法を使用できるか、ハンドラーがこの目的であるかどうかは実際にはわかりません。
質問する
335 次
2 に答える
9
しかし、現在のアプリではダウンロードしたデータが大きすぎるため、バックグラウンドでダウンロードするために使用できる他の方法はありますか?
doInBackground
長いタスクに正確に使用される方法であるため、私はあなたのタイトルに同意しません. 非常AsyncTask
に強力なツールであり、タイプ セーフでもあります。
しかし、別の解決策もあります。
もう 1 つのクリーンで効率的な方法は、IntentService
with を使用することResultReceiver
です。
で使用する場合IntentService
はResultReceiver
、基本的な例を次に示します
から拡張するクラスを作成するだけで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);
}
//...
}
そしてonReceiveResult
fromの実装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
簡単な提案:
- データが独立している場合、複数の AsyncTask を実行できます。
- onProgressUpdate() メソッドを利用できます。
于 2012-06-23T10:39:51.947 に答える