Android开发你应该懂的:AsyncTask
1.什么是AsyncTask
AsyncTask的存在是为了让我们更方便的操作UI线程,该类允许执行后台操作并在UI线程上更新结果,而不必操作线程和或处理程序。
2. 如何使用
1.继承AsyncTask,并实现它的3个方法
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));
//如果调用cancel()方法,则提前结束任务
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
2.创建完成后,调用以下方法执行
new DownloadFilesTask().execute(url1, url2, url3);
2.AsyncTask的泛型类型
AsyncTask继承自Object,定义如下:
android.os.AsyncTask<Params, Progress, Result>
AsyncTask是一个抽象类,当我们定义一个类来继承AsyncTask这个类的时候,我们需要为其指定3个泛型参数:
①Params::异步任务执行时传入的参数类型;
②Progress:异步任务执行过程中,返回下载进度值的类型;
③Result:异步任务执行完后返回给UI线程的结果的类型;
如果AsyncTask确定不需要传递具体参数,那么这三个泛型参数可以用Void来代替
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
3.AsyncTask使用时4个步骤
当我们执行一个异步任务的时候,通常需要按照下面的4个步骤分别执行
- onPreExecute(), 这个方法是在执行异步任务之前的时候执行,并且是在UI 线程当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如显示进度条
- doInBackground(Params...), 在onPreExecute()方法执行完之后,会立即执行这个方法,这个方法就是用来处理耗时操作的,任务一旦完成就可以通过return语句来将任务的执行结果进行返回,其实就是发送给我们的最后一个 onPostExecute 方法,在这个方法中是不可以进行UI操作的,如果需要更新UI,比如说反馈当前任务的执行进度,可以调用publishProgress(Progress...)方法来完成。
- onProgressUpdate(Progress...), 这个方法是在调用publishProgress(Progress ...)之后,在UI线程上调用,利用publishProgress传递的数值来更新下载进度。
- onPostExecute(Result),当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI 线程当中调用的,我们可以将返回的结果显示在UI控件上
4.AsyncTask的其它知识点
1.取消任务(Cancelling a task)
除了上面四个方法,AsyncTask还提供了onCancelled()方法,
在任何时候都可以通过调用cancel(boolean)来取消任务。
调用此这个方法后,isCancelled()将返回true。如果调用了这个方法,那么在 doInBackgroud() 方法执行完之后,就不会调用 onPostExecute() 方法了,取而代之的是调用 onCancelled() 方法。为了确保Task已经被取消了,我们需要经常调用 isCancelled() 方法来判断,如果有必要的话。
2.线程规则(Threading rules)
在使用AsyncTask做异步任务的时候必须要遵循的原则
1.AsyncTask类必须在UI线程中加载,在Android Jelly_Bean(4.1)版本后这些都是自动完成的
2.AsyncTask的对象必须在UI Thread当中实例化
3.execute方法必须在UI Thread当中调用
4.不要手动调用onExcute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。
- AsyncTask任务只能执行一次(如果执行第二次,会引发异常)。