title: Android_AsyncTask
目的
异步任务允许你在用户的接口上执行异步工作。将线程阻塞性任务放在工作线程,然后将结果推回UI主线程。用异步任务的好处是用户不需要再去开启线程,去做一些线程里面方法的顺序操作。而 AsyncTask 其实就是一个线程框架,它已经为我们封装好了
在Android3.0以上的版本中,为了使得Android UI能够更加流畅,不允许用户在UI的主线程中访问网络,所以会强制用户开辟一个子线程,在这个线程中完成下载耗时的操作(比如从网络中下载一张图片),此时UI的主线程与下载的子线程是存在一个异步的过程,一旦子线程中下载图片完成,就要把结果推送到UI上。
基本语法
AsyncTask类由三个泛型参数和4个回调方法实现的
三个泛型参数
- Params: 启动任务执行的输入参数,比如HTTP请求的URL
- Progress: 后台任务执行的百分比会发布到UI主线程中
- Result: 后台执行任务最终返回的结果,比如String,Integer等
如果三个泛型都没有类型,我们就用Void代替
private class MyTask extends AsyncTask<Void, Void, Void>{}
四个回调方法
- onPreExecute(): 在任务执行之前在UI主线程中被调用的。这个通常是用来做任务的准备,比如获得一个显示进度条的实例等
- doInBackground(Params...): onPreExecute()执行完成后马上被后台的进程中调用,用来处理耗时的操作,异步任务的输入参数也会传递到这里。计算得到结果会通过后面的执行方法(onPostExecute())推送到UI主线程中。这个步骤还可以使用使用 publishProgress(Progress...) 来显示进度刻度。这些刻度会在UI主线程中实时显示通过onProgressUpdate(Progress...)方法
- onProgressUpdate(Progress...): publishProgress(Progress...)方法执行之后会被UI主线程调用,用来在UI主线程中实时显示计算刻度。
- onPostExecute(Result): 在后台计算完成之后被UI主线程调用。doInBackground()方法返回的结果会作为它的一个参数来推送到UI主线程中
中途取消执行
异步任务可以在任意时间调用cancel(boolean)来取消,调用这个方法之后会造成后续的isCancelled()方法都是返回true,取消之后在执行完doInBackground(Object[])后onCancelled(Object)方法会代替onPostExecute(Object)方法被执行。
了能尽快取消一个任务,我们应该在doInBackground(Object[])里周期性的检查isCancelled()的返回值(例如在一个循环里)
注意事项
- AsyncTask类必须在UI主线程中被加载
- 任务类的实例(即new出一个继承AsyncTask类,作为匿名内部类的实例)必须在UI主线程中创建
- execute(Params...) 必须在UI主线程中被调用
- 不要手动的去调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)这些方法
- 任务只能被执行一次
有空再写Demo吧,现在只了解个大概
网友评论