Handler
Handle是一套 Android 消息传递机制,主要用于线程间通信
handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message
Binder/Socket用于进程间通信
- Message :代表一个行为或者一串动作 每一个消息在加入消息队列时,都有明确的目标Handler
- ThreadLocal: 线程本地存储区(Thread Local Storage,简称为TLS)ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用
- MessageQueue :以队列的形式对外提供插入和删除的工作
- Looper :Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理
- Handler :消息的真正处理者, 具备获取消息、发送消息、处理消息、移除消息等功能
消息机制
- 以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。
- Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。
- 在Handler的handleMessage方法中处理该消息,这就完成了一个消息的发送和处理过程。
使用步骤
创建 Handler
将 Handler 定义成静态的内部类
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| public class HandlerActivity extends AppCompatActivity {
private Button bt_handler_send;
private static class MyHandler extends Handler {
//弱引用持有HandlerActivity , GC 回收时会被回收掉 private WeakReference<HandlerActivity> weakReference;
public MyHandler(HandlerActivity activity) { this.weakReference = new WeakReference(activity); }
@Override public void handleMessage(Message msg) { HandlerActivity activity = weakReference.get(); super.handleMessage(msg); if (null != activity) { //执行业务逻辑 Toast.makeText(activity,"handleMessage",Toast.LENGTH_SHORT).show(); } } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.HandlerActivity);
//创建 Handler final MyHandler handler = new MyHandler(this);
bt_handler_send = findViewById(R.id.bt_handler_send); bt_handler_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { //使用 handler 发送空消息 handler.sendEmptyMessage(0);
} }).start(); } }); } @Override protected void onDestroy() { //移除所有回调及消息 myHandler.removeCallbacksAndMessages(null); super.onDestroy(); } }
|
Message 获取
1 2 3
| Message message = myHandler.obtainMessage(); //通过 Handler 实例获取 Message message1 = Message.obtain(); //通过 Message 获取 Message message2 = new Message(); //直接创建新的 Message 实例
|
Handler 发送消息
1 2 3 4 5
| public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private static class MyHandler extends Handler { private final WeakReference<MainActivity> mTarget;
public MyHandler(MainActivity activity) { mTarget = new WeakReference<MainActivity>(activity); }
@Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); HandlerActivity activity = weakReference.get(); super.handleMessage(msg); if (null != activity) { //执行业务逻辑 if (msg.what == 0) { Log.e("myhandler", "change textview"); MainActivity ma = mTarget.get(); ma.textView.setText("hahah"); } Toast.makeText(activity,"handleMessage",Toast.LENGTH_SHORT).show(); } } }
|