Handler学习知识储备:
主线程:Main Thread (UI Thread)。andorid执行的线程,称为主线程,负责分发实现到UI窗口,也是应用和UI交互的线程。所以称为UI线程。
ANR:应用无响应(application not responding)。如果UI线程阻塞超过几秒(一般5秒),会出现应用无响应的额Dialog。
下面上代码来解释主线程和ANR:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
//查看当前线程,
Log.d("TAG", "current Thread's name:" + Thread.currentThread().getName());
//休眠UI线程5秒,制造ANR
Thread thread = Thread.currentThread();
try {
thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Handler机制,android应用程序在被创建的时候会创建一个UI主线程,为防止阻塞UI主线程,将耗时的操作放到子线程中进行处理,处理完之后操作UI ,android不允许子线程操作UI,android通过handler消息机制来实现线程之间的通讯。
Handler机制的主要角色
Message:消息,包含消息id,消息处理对象以及处理的数据等。由MessageQueue统一列队,由Handler处理。在线程之间传递消息。在内部携带少量的消息,用于在不同线程之间交换数据,除了what字段,用arg1和arg2来携带一些整型数据,使用obj字段携带一个Object对象。
message包含以下域:
what:定义消息的类型。
obj: 用于保存数据;
target:处理这个message的Handler对象。
Message的创建和处理都是一个handler完成,通常是target是自动填充。
Handler:处理着,负责message的发送及处理。使用handler时,需要实现handlerMessage(Message msg)方法来对特定的Message进行处理。例如更新ui等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,按照FIFI规定执行。存放Message并非实际意义的保存,将Message以链表的方式串联起来,等待looper的抽取。
Looper::消息泵,不断地从MessageQueue中抽取Message执行。一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
Handler机制主要运用
1.发送消息,在不同的线程间发送消息,使用的方法为sendXXX();
sendEmptyMessage(int);//发送一个空的消息
sendMessage(Message);//发送消息,消息中可以携带参数
sendMessageAtTime(Message,long);//未来某一时间点发送消息
sendMessageDelayed(Message,long);//延时Nms发送消息
举例:主线程定义Handler
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 String data = (String) msg.obj; textView.setText(data); break; default: break; } } };