1.AsyncTask
1-1:为什么要使用AsyncTask?
由于android开发时,不允许在主线程中进行耗时操作(网络请求,ui改变等),所以需要在子线程中进行相应的耗时操作,为了满足多线程之间的通信,提出了Handler类(异步操作的核心类)。由于Handler核心类中涉及了相对复杂的操作(涉及Handler,Message,Looper,Thread),所以自android1.5开始,引入了AsyncTask类,这是一个轻量级的框架,在内部封装了Handler,方便使用。
1-2:AsyncTask中的简单定义:
class TestTask extends AsyncTask<Params, Progress, Result>
用一个类去继承此抽象类,同时,在继承的同时可以使用其中的三个泛型参数
1、Params:供后台使用的参数,在调用execute方法时传递的参数类型
2、progress:后台任务的执行任务的类型
3、Result:后台任务的返回参数的类型
1-3:在AsyncTask中常被复写的方法
1.onPreExecute()在异步任务开始前进行调用,用于进行界面的一些初始化操作(主线程)
2.doInBackground(params...) 在此处去实现所有的耗时操作,通过return返回参数(类型为泛型3),在该方法中不能进行ui操作,如果要进行任务进度的更新,必须调用publishProgress(tType_progess),实现进程更新的汇报(子线程)
3.onProgressUpdate(Progress) 当子线程中调用了publishProgress后,会触发该函数(如果无上述函数,该函数不会被触发),接收了上传的任务进度值,可以进行ui的更新(主线程)
4.onPostExecute 异步任务执行完毕后,该函数接收doInBackground传递而来的泛型,通过返回的时候可以进行ui更新等操作
注:1 2 4方法在AsyncTask中一定被调用,而3需要被publishProgress触发
使用实例:模拟异步下载任务时的进度条变化
public class MainActivity extends AppCompatActivity {
private Button btn;
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
pb = (ProgressBar) findViewById(R.id.pb);
}
public void startTask(View view) {
// TestTask task=new TestTask();
// task.execute();
new TestTask().execute();
}
class TestTask extends AsyncTask<Void, Integer, Boolean> {
//在异步线程中执行想要的耗时操作
int progress = 0;
@Override
protected void onPreExecute() {
super.onPreExecute();
//当前依旧在主线程之中 可以进行相应的准备工作
Log.d("TAG", "准备下载");
pb.setVisibility(View.VISIBLE);
}
@Override
protected Boolean doInBackground(Void... params) {
Log.d("TAG", "正在下载");
try {
while (true) {
Thread.sleep(1000);//模拟每隔1s下载百分之10
progress += 10;
publishProgress(progress);
if (progress >= 100) {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.d("TAG", "下载回调" + values[0] + "%");
pb.setProgress(values[0]);
}
//回主线程
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if(aBoolean==true){
Log.d("TAG", "下载成功");
pb.setVisibility(View.GONE);
}else {
Log.d("TAG", "下载失败");
pb.setVisibility(View.GONE);
}
}
}
}
注:关于AsyncTask和Handler的对比
AsyncTask和Handler同样用于异步操作 但是区别在于: 1.AsyncTask是android提供的一个轻量级的异步类,可以直接继承AsynTask,在类中实现异步操作,同时使用两个函数在主线程和子线程中相互进行沟通 优点:简单快捷,过程可控 缺点:在多个异步操作合并需要UI变更的时候,变得复杂 2.Handler 在实现异步操作的时候 涉及Handler Message Looper Thread 四个对象,过程是首先用主线程启动Thread(子线程),子线程运行并生成Message,通过Handler进行Message的装填,然后Looper去消息队列中取出Message 由主线程的Handler进行UI变更 优点:使用结构清晰明确,尤其是对于多个任务时 缺点:单个异步任务时,代码过多,结构相对过于复杂 总结: 看异步任务的多少来使用AsyncTask或者Handler