您的位置:首页 > 移动开发 > Android开发

Android 解析AsyncTask(一)

2015-07-25 19:18 459 查看

Android 解析AsyncTask(一)

大家都知道在开发Android中涉及到UI的修改都必须在UI线程中操作,并且执行耗时的操作绝不能在UI线程上干,一般使用线程或者开启线程池处理。如果要把耗时的任务执行的结果显示到UI上,也许会使用Thread+Handler这种方式来处理,但是个人感觉其内聚性不是很高。而AsyncTask非常适合上述应用场景,它其实是Thread+Handler的结合体,通过它你可以执行耗时的操作,并把结果转移到UI线程中,甚至可以显示执行进度,下面阐述下它的基本使用方法。

使用

AsyncTask是个抽象类,如果你使用的话必须要实现doInBackground(Params…)方法,一般的话你也要复写onPostExecute(Result),下面给出一个简单的样例

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}


上述类创建好后,就可以轻松调用了,

new DownloadFilesTask().execute(url1, url2, url3);


AsyncTask的三种参数类型

当你继承AsyncTask时需要你指定三种参数类型

Params, 就是AsyncTask执行时接受的可变参数类型,

也是方法doInBackground传入的参数类型

Progress 进度更新时传入的参数也是方法

publishProgress、onProgressUpdate传入的参数

Result 后台执行后返回的数据类型

如果你觉得不需要参数的话,你可以都用Void来代替

private class MyTask extends AsyncTask<Void, Void, Void> { ... }


AsyncTask执行的四步

当一个异步任务被执行时,AsyncTask会执行下述四个步骤:

onPreExecute(),

该方法会在UI线程中调用并且是在任务被执行前调用,你可以在这里去创建一个对话框显示其进度或者提示信息。

doInBackground(Params…),

当onPreExecute()调用结束后该方法立马被执行并且是运行在后台线程中。所以你可以在该方法中执行耗时的操作比如网络的请求,文件下载等等。该方法的参数就是你传入给AsyncTask的参数,执行后会返回结果,并会把结果传递给第四步。你可以在该方法中调用publishProgress(Progress…)去发布进度信息,该进度信息会被转移到onProgressUpdate(Progress…)方法中。

onProgressUpdate(Progress…),

调用publishProgress(Progress…)后该方法会在UI线程中被调用,该方法能够显示后台任务执行的进度消息等。

onPostExecute(Result),

后台任务执行完毕后将调用该方法,并将计算的结果以参数的形式转移给该方法。

取消一个任务

你可以通过调用cancel(boolean)来取消任务,调用它后onCancelled(Object)将会在doInBackground(Object[]) 返回之后被调用,onPostExecute(Object)则不会执行,为确保任务能够被及时取消,建议取消前使用isCancelled()方法判断当前任务是否被取消。

注意事项

AsyncTask必须在UI线程创建,且方法execute(Params…) 也必须在UI线程中使用

不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 方法

任务仅仅能被执行一次,如果调用多次execute方法将会抛出异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android asynctask 线程