1. 消息队列 Handler
2. Handler的消息传递机制
arg1\arg2传递int类型的值 obj传递对象
3. Handler的编程接口
4. Handler编程思路
1\主线程Activity创建Handler
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//处理消息,运行在创建它的线程中
switch (msg.what){
case 0x0001:
int index = msg.arg1;
test.setText(index+"");
break;
}
}
};
2\实现子线程run()方法重写
public void login(View view){
//使用线程完成
//工作线程是一个匿名类
new Thread(){//子线程不可更新UI线程中的控件属性
@Override
public void run() {
for(int i=0;i<100;i++){
Message msg = new Message();
msg.what = 0X0001;//消息的what是消息标识,必须有
msg.arg1 = i;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
---------------------------------------------------------------------------------------------------------------------------------
5. AsyncTask异步类
6. AsyncTask编程思路
1\创建方法继承AsyncTask,主线程中直接调用该方法即可实现
class MyTask extends AsyncTask<Void, Integer, Void>{
@Override
/**
* 运行在后台,相当于是Thread中的run()方法
* 运行在子线程中的方法
*/
protected Void doInBackground(Void... voids) {
for(int i=0;i<=100;i++){
publishProgress(i);//传参数, 自动调用onProgressUpdate()方法
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
/**
* 进度指示的方法
* 运行在主线程中,在这个方法中可以直接更新控件的属性
*/
protected void onProgressUpdate(Integer... values) {
int num = values[0];
test.setText("num:"+num);//更新主线程中UI控件属性
super.onProgressUpdate(values);
}
@Override
/**
* 运行在主线程中,当后台运行结束,自动调用该方法
*/
protected void onPostExecute(Void unused) {
Toast.makeText(MainActivity.this,"子线程运行结束",Toast.LENGTH_LONG).show();
super.onPostExecute(unused);
}
}