我大部分时间都在使用Asynctask,但是在当前应用程序中,下载的数据太大,以至于我可以使用其他方法进行后台下载,我实际上并不确定处理程序是否用于此目的。
答案 0 :(得分:9)
但是在当前应用中,下载的数据太大,所以其他 我可以用来做后台下载的方法,
我不同意你的标题,因为doInBackground
是一种完全用于长期任务的方法。所以AsyncTask
是非常强大的工具,也是类型安全的。
还有另一种解决方案。
另一种清晰有效的方法是IntentService
使用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
{/ 1>}实施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 nad ResultReceiver的更多信息。
答案 1 :(得分:1)
快速建议: