我大部分时间都在使用Asynctask,但在当前应用程序中,下载的数据太大,以至于我可以使用其他方法进行后台下载,我实际上并不确定处理程序是否用于此目的.
但在当前的应用程序中,下载的数据太大,以至于我可以使用其他方法进行后台下载,
我不同意你的标题,因为这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);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
并实施onReceiveResult从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.");
}
}
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.
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |