为什么要使用AsyncTask?
这与android的UI操作不是线程安全的有关。
1、android的主程序中不能进行耗时操作
2、android又不允许我们在子线程中操作主线程中的UI控件
3、UI操作只能在UI线程中执行
4、耗时操作要在子线程中执行,执行完成后将结果返回给主线程去刷新UI
AsyncTask的使用好处?
1、我们不需要自己创建子线程,AsyncTask内部已经封装好了线程池去执行耗时操作
2、不需要自己写相应的方法去更新UI界面 例如:根据下载进度更新UI界面中的ProgressBar的进度
3、AsyncTask已经包含了所有子线程和UI线程需要处理的操作
AsyncTask的异步任务
1、包含了一系列的回调方法来在子线程中去完成耗时操作,并将结果返回给主线程去刷新UI
2、作为不是大神的我们只需要继承AsyncTask,提供三个泛型参数,实现这几个回调方法即可。
3、调用execute(params)方法来执行这个异步任务
AsyncTask的使用步骤
1、创建子类继承AsyncTask
2、复写AsyncTask的抽象方法,完成耗时操作并刷新UI
3、调用AsyncTask.execute(String params)方法执行异步任务
AsyncTask的周期
1、onPreExecute
第一个被调用的方法
在UI线程中执行
做后台任务启动前的准备工作
2、doInBackground
第二个调用的方法
在子线程中执行,处理耗时操作,并将结果返回给pnPostExecute
这个方法是由系统调用,不用人为的去调用,入参是第一个参数的泛型参数,返回值对应第三个泛型参数
3、onProgressUpdate
第三个调用的方法
需要在doInBackGround中调用publishProgress方法,才会调用,入参是第二个泛型参数
4、onPostExecute
第四个被调用的方法
在UI线程中执行,入参就是doInBackGround的返回值
AsyncTaskDemo
class MyTask extends AsyncTask<String,Void,byte[]>{
/**
在主线中执行,做一些准备工作
*/
protected void onPreExecute(){
super.onPreExecute();
}
/**
这个方法在子线程中执行,入参是第一个参数泛型,返回第三个参数泛型
*/
protected byte[] doInBackground(String...params){
return null;
}
/**
这个方法在主线程中执行,入参是DoInBackGround的返回值
*/
protected void onPostExecute(byte[] result){
super.onPostExecute(result);
}
}