EventBus作用

它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片间进行通信的问题,可以避免由于使用广播通信而带来的 诸多不便。

三个角色

  • Event:事件,可以是任意类型,EventBus会根据事件类型进行全局的通知
  • Subscriber:事件订阅者,在EventBus之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING
  • Publisher事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

四种线程模型

  • POSTING(默认)表示事件处理函数的线程跟发布事件的线程在同一个线程
  • Main表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作
  • BACKGROUND表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果发布事件的线程是后台线程,那么事件处理函数就使用该线程。
  • ASYNC表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

基本使用

事件

public class MyEvent {
    private String message;

    public MyEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

订阅模块

public class MainActivity extends AppCompatActivity {
    private Button button;
    private TextView textView;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=findViewById(R.id.turn);
        textView=findViewById(R.id.myText);
        textView.setText("我很生气");

        EventBus.getDefault().register(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));

            }
        });


    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void Event(MyEvent myEvent){
       textView.setText(myEvent.getMessage());
    }



    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(EventBus.getDefault().isRegistered(this)){
            EventBus.getDefault().unregister(this);
        }

    }
}

发布事件

public class SecondActivity extends Activity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
         button=findViewById(R.id.button2);
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 EventBus.getDefault().post(new MyEvent("滚去第一个"));
                 finish();
             }
         });

    }
}

运行结果:

在这里secondActivity发布事件,MainActivity接收到消息使得”我很生气”文本改变为”滚回第一个”。

版权声明:本文为dearnotes原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dearnotes/p/12346667.html