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

Pro*_*mer 4 android

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

Sim*_*iak 9

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

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

但也有另一种解决方案.
另一种清洁和高效的方法是使用IntentServiceResultReceiver.

当你决定使用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);
   }
   //...
}
Run Code Online (Sandbox Code Playgroud)

并实施onReceiveResultResultReceiver:

@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.");
   }
}
Run Code Online (Sandbox Code Playgroud)

开始Service使用时

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

所以,在你IntentService的工作和你的工作

receiver.send(PROGRESS_UPDATE, data);
Run Code Online (Sandbox Code Playgroud)

您只需发送有关更新进度的信息即可UI.

注:但是看到有关的详细信息IntentService河畔ResultReceiver.