Eventbus

1. EventBus作用

它简化了应用程序内各个组件之间进行通信的复杂度,尤其是避免了fragment间通信的复杂度。假如我们使用广播来通信,略显麻烦,如果传递的数据是实体类,那么还需要序列化。
正是因为EventBus的解耦并且使用方便,开销小(避免实体类数据序列化)才得以广泛应用。

1.1 三个角色

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

1.2 四种线程模型

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

引入方式: implementation "org.greenrobot:eventbus:3.3.1"
可参阅其github地址https://github.com/greenrobot/EventBus

2. 基本使用

2.1 事件

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;
    }
}

2.2 订阅模块

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);
        }

    }
}

使用时需注意要在setContentView()之后进行EventBus的注册,官方推荐在Activity生命周期中的onStart()方法中注册,在onStop()中销毁。

2.3发布事件

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接收到消息使得"我很生气"文本改变为"滚回第一个"。

posted @ 2020-02-22 22:14  我的小鱼干嘞  阅读(286)  评论(0编辑  收藏  举报