如果Asynctask不是用于进行长时间后台处理,那么我应该使用什么方法

时间:2012-06-23 10:37:25

标签: android

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

2 个答案:

答案 0 :(得分:9)

  

但是在当前应用中,下载的数据太大,所以其他   我可以用来做后台下载的方法,

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

还有另一种解决方案。
另一种清晰有效的方法是IntentService使用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);
   }
   //...
}

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)

快速建议:

  1. 如果数据是独立的,您可以执行多个AsyncTask。
  2. 您可以利用onProgressUpdate()方法。