EventBus1:基本使用

EventBus

  • Android 事件发布/订阅框架;
  • 事件传递既可用于Android 四大组件间通信,也可用于线程间通信。
  • 优点:代码简洁,使用简单,将事件发布 事件订阅充分解耦。
    传统的事件传递 如子线程与UI线程通信:handler,广播,接口回调等。
    org.greenrobot:eventbus:3.0.0

1.Handler 完成通信

Handler 负责发送消息;
Looper 负责接收 Handler 发送过来的消息 message,然后放到MessageQueue中 进行轮循。
最后Looper会把 message 返回给 Handler,调用它的handleMessage(msg) 来进行异步消息的处理。

1.1 主线程发送消息给子线程执行

  private Handler handler;
  class MyThread extends Thread {
      @Override
      public void run() {
          Looper.prepare();
          handler = new Handler() {
              @Override
              public void handleMessage(@NonNull Message msg) {
                  System.out.println("handleMessage:" + Thread.currentThread().getName());
                  System.out.println(msg.what + "-" + msg.obj);
              }
          };
          Looper.loop();
          super.run();
      }
  }
  findViewById(R.id.btn_my_taxi).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Message msg = handler.obtainMessage();//主线程发送消息给子线程
                msg.what = 1; msg.obj = "obj msg";
                handler.sendMessage(msg);
                System.out.println("onclick: " + Thread.currentThread().getName());
            }
        });
 new MyThread().start();

1.2 子线程发送消息,UI线程处理。

 static Handler handler = new Handler() { //主线程定义handler
      @Override
      public void handleMessage(@NonNull Message msg) {
          System.out.println("handleMessage:" + Thread.currentThread().getName());
          System.out.println(msg.what + "-" + msg.obj);
      }
  };
  private void initViews() {
      findViewById(R.id.btn_my_taxi).setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              Thread thread = new Thread(new Runnable() {
                  @Override
                  public void run() {
                      Message msg = handler.obtainMessage();//主线程发送消息给子线程
                      msg.what = 1;
                      msg.obj = "obj msg";
                      handler.sendMessage(msg);
                      System.out.println("run: " + Thread.currentThread().getName());
                  }
              });
              thread.start(); //开启子线程
          }
      });
  }     

2.EventBus 如何简化handler通信的。 根据Event类型匹配。

implementation 'org.greenrobot:eventbus:3.0.0'

public class MyBusEvent { //1.自定义message类型
    public String message;
    public MyBusEvent(String message) { this.message = message;}
}
@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);//3.注册
}
@Override
protected void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);//3.反注册
}
//2.订阅者,一定要带上注解,表示是订阅者,表示onMessageEvent在主线程中完成
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MyBusEvent event) {
    Toast.makeText(this, event.message, Toast.LENGTH_LONG).show();
}
//4.发送事件,可以在代码任意位置发送自定义类型的消息
EventBus.getDefault().post(new MyBusEvent("Msg from Moon."));

用法总结:
1.定义事件Event
2.准备订阅者 @Subscribe来表明,(threadMode = ThreadMode.MAIN)表明方法在UI线程中。
3.订阅者同时需要在总线上 注册和反注册自己。
4.发送事件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容