Handler是android中一套用来更新UI的机制,也是一套消息处理机制。
在非UI线程中更新UI会报错,但是直接在OnCreate()方法中并不会报错,因为此时检查机制还未使用,但是不要这么做。必须在UI线程中更新UI。
1 2 3 4 5 6
| mHandler.post(new Runnable() { @Override public void run() { mTextView.setText("update thread"); } });
|
sendMessage()和removeCallbacks()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { mTextView.setText(""+msg.arg1+msg.obj); } };
```java new Thread(){ @Override public void run() { try{ Thread.sleep(2000);
Message message=mHandler.obtainMessage(); Person person=new Person(); message.arg1=100; person.age=10; person.name="aaa"; message.obj=person; message.sendToTarget(); }catch (InterruptedException e){ e.printStackTrace(); }
} }.start();
|
1
| mHandler.removeCallbacks(mMyRunnable);
|
消息截获
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private Handler mHandler=new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Toast.makeText(getApplicationContext(),""+1,Toast.LENGTH_SHORT).show(); return false; } }){ @Override public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(),""+2,Toast.LENGTH_SHORT).show(); }
...... };
|
handler总结
handler负责发送消息,Looper负责接收Handler发送的消息,并将消息发给handler自己。
使用Handler更新UI的原因
如果在一个Activity中有多个线程去更新UI,若都没有加锁会导致界面更新混乱。若都加锁,则会导致性能下降。