一、适用:
android中特有的多线程通信机制,在activity代码中的指定位置发送消息给UI线程,需继承类AsyncTask。
二、说明:
1. android的ui线程主要用于UI页面初始化、更新,如果在此线程进行耗时操作,则可能出现页面加载失败、缓慢、崩溃等应用异常。
2.ui线程在页面加载onCreate方法时启动,因此直接或间接在onCreate方法中调用耗时较长的方法,可能会造成异常。所以此时需要使用多线性,把耗时任务放入新建线程里面处理,不影响ui线程。
3.耗时线程在处理过程中或者结束可以通过线程通信机制发送消息给ui线程,从而实现ui页面的更新。asynctask是常用的android线程通信机制的一种。
4.doInBackground方法用在耗时线程,目的是发送消息给ui线程
onPreExecute、onProgressUpdate、OnPostExecute方法用在ui线程,目的分别是其他线程的执行前、执行过程中、执行完成后接收消息,然后在ui线程处理(页面显示、更新)
三、示例:
MyAsyncTask myAsyncTask=new MyAsyncTask();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testInfoTv = findViewById(R.id.tv_test_info);
myAsyncTask.execute();
}
/*
此处AsysncTask的3个参数类型,分别需要和doInBackground、onProgressUpdate、onPostExecute一致。
MyAsyncTask是一个匿名类,继承了AsyncTask
*/
private class MyAsyncTask extends AsyncTask<String,String,String> {
@Override
protected void onPreExecute() {
testInfoTv.setText("测试准备中");
}
@Override
protected String doInBackground(String... strings) {
int i=0;
while(i<100){
try {
i++;
if(i==20) publishProgress("测试进度20%");
if(i==100){
publishProgress("测试进度100%");
return "PASS";
}
Thread.sleep(1000);
}
catch (Exception e) {
e.printStackTrace();
}
}
return "FAIL";
}
@Override
protected void onProgressUpdate(String... values) {
testInfoTv.setText(values[0].toString());
/*
先后执行:
testInfoTv.setText("测试进度20%");
testInfoTv.setText("测试进度100%");
*/
}
@Override
protected void onPostExecute(String s) {
switch (s){
case "PASS":
testInfoTv.setText("测试成功");
break;
case "FAIL":
testInfoTv.setText("测试失败");
break;
default:
break;
}
}
}