4

我大部分时间都在使用 Asynctask,但是在当前应用程序中下载的数据太大,所以我可以使用什么其他方法进行后台下载,我实际上不确定处理程序是否用于此目的。

4

2 回答 2

9

但是在当前应用程序中下载的数据太大所以我可以使用其他方法进行后台下载,

我不同意您的标题,因为这doInBackground是一种完全用于长时间任务的方法。所以AsyncTask非常强大的工具也是类型安全的。

但还有另一种解决方案。
另一种干净有效的方法是使用IntentServicewith ResultReceiver

当您决定使用IntentServicewith 时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);
   }
   //...
}

并执行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 回答