1.什么是Handler?
Handler是安卓SDK中处理异步消息的核心类。
Handler的作用是让子线程通过与主线程通信来更新UI界面。
2.Handler的运行机制
创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来。
当我们在线程处理完数据后,可以通过Handler对象将消息发出。
消息将会会按顺序添加到消息队列中。
UI线程中的Looper不断从消息队列中取出消息刷新UI。
3.什么是Looper和MessaQueue?
Looper:在安卓在创建出来的普通线程是默认没有消息循环的,run方法执行完毕后,线程也结束了。如果让子线程不停的做循环工作,可以使用Looper,将普通线程变成循环线程。
MessaQueue:当创建一个Looper时,将会自动创建chuMessaQueue,一个线程中只会存在一个Looper和一个MessaQueue,当MessaQueue中有消息时,Looper将从MessaQueue取出消息。
4.什么是Message?
Message是子线程发出的消息,其中Message有4个属性。
what属性
int类型的消息码,接收方用来识别是什么消息。
arg1,arg2属性
int类型,仅仅只能传递整型数字。
obj属性
object类型,用来传输String和人也类型时使用。
send’To Target方法
将消息发给指定Handler对象。
5.如何使用Handler?
在UI线程中创建Handler匿名内部类对象;
在匿名内部类中重写Handler Message方法;
在UI线程中启动子线程;
在线程中获得Message对象;
将需要传递的数据赋值到Message对象中;
通过handler对象的sendMessage方法发送消息到消息队列中;
在handlerMessage方法中的消息。
6.倒计时案例
主要是先创建handler,在发布消息,最后捕获消息。
public class HandlerActivity extends AppCompatActivity {
private EditText zbtv1;
private TextView zztv1;
private Button ksbtn1;
private int time;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
zztv1.setText(msg.what + "");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
BindId();
ksbtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time = Integer.parseInt(zbtv1.getText().toString());//将字符串转换成整形
new Thread(new Runnable() {
@Override
public void run() {
for (int i = time; i > 0; i--)
{
//更新UI
Message message=handler.obtainMessage();
message.what=i;
handler.sendMessage(message);
//handler.sendEmptyMessage(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
});
}
private void BindId() {
zbtv1 = findViewById(R.id.zbtv);
zztv1 = findViewById(R.id.zztv);
ksbtn1 = findViewById(R.id.ksbtn);
}
}
产生效果如下