简介
Android中默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但是实际上,5秒内就十分影响用户体验了。所以才有了异步任务(AsyncTask)的出现。
- 为了避免UI失去响应的问题,Android建议将耗时的任务放在新的线程中完成,包括从网络获取图片、获取数据等等。
更新UI
- 使用Handler来实现线程之间的通讯
- View.post(Runnable)
- View.postDelayed(Runnable ,long)
- Activity.runOnUiThread(Runnable)
AsyncTask
AsyncTask参数
Params,Progress,Result
- Params:第一个参数是启动任务传进来的参数;
- Progress:第二个参数是用来显示进度条的参数;
- Result:第三个参数是后台执行后返回的参数的类型。
几个方法
- onPreExecute(): 在UI线程里面调用,它在这个task执行后会立即调用。我们在这个方法里面通常是用于建立一个任务,比如显示一个等待对话框来通知用户。
- doInBackground(Params…):这个方法从名字就可以看出,它是运行在后台线程的,在这个方法里面,去做耗时的事情,比如下载访问网络,操作文件等。这这个方法里面,我们可以调用publishProgress(Progress…)来调用当前任务的进度,调用了这个方法后,对应的onProgressUpdate(Progress…)方法会被调用,这个方法是运行在UI线程的。
- onProgressUpdate(Progress…):运行在UI线程,在调用publishProgress()方法之后。这个方法用来在UI上显示任何形式的进度,比如你可以显示一个等待对话框,也可以显示一个文本形式的log,还可以显示toast对话框。
- onPostExecute(Result):当task结束后调用,它运行在UI线程。
- 取消一个task,我们可以在任何时候调用cancel(Boolean)来取消一个任务,当调用了cancel()方法后,onCancelled(Object)方法就会被调用,onPostExecute(Object)方法不会被调用,在doInBackground(Object[])方法中,我们可以用isCancelled()方法来检查任务是否取消。
- 几点规则:
- AsyncTask实例必须在UI线程中创建,execute(Params…)方法必须在UI线程中调用。不用手动调用onPreExecute(), onPostExecute(),doInBackground(), onProgressUpdate()方法。一个任务只能被执行一次。