使用EventBus来代替Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信,避免代码量大时代码高度耦合:

1、首先在项目的 build.gradle 文件中的  dependencies下加入如下远程依赖:

compile 'org.greenrobot:eventbus:3.1.1'
然后点击 Sync Now等待项目build完成即可。

    混淆需加入如下代码在自己的混淆文件中:

     

-keepattributes *Annotation*-keepclassmembers class * {    @org.greenrobot.eventbus.Subscribe ;}-keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    (java.lang.Throwable);}

2、发送消息---Eventbus发送消息发送的都是对象 基本数据类型不可被发送(如 int,但是integer可以直接被发送)

3、接收消息---@Subscribe注解加在自定义方法上接收消息,同时注解后要加上线程模式(默认是posting模式)。

  接收消息的地方要注册事件以及解除注册;EventBus.getDefault().register();以及unregister()来注册以及取消注册。

4、线程模式:一共有四种线程模式

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

DEMO:

首先新建要发送的消息对象:TestMessageBean

public class TestMessageBean {    private String mname;    private String des;    public TestMessageBean(String mname, String des) {        this.mname = mname;        this.des = des;    }    public String getMname() {        return mname;    }    public void setMname(String mname) {        this.mname = mname;    }    public String getDes() {        return des;    }    public void setDes(String des) {        this.des = des;    }}

     接收处理事件的activity:  TestEventbusReceiver.class

public class TestEventbusReceiver extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "TestEventbusReceiver";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_eventbus_receiver);        Button jumpButton = (Button) findViewById(R.id.button4);        jumpButton.setOnClickListener(this);        Log.i(TAG, "onCreate: 执行");     EventBus.getDefault().register(this);    } @Override    protected void onDestroy() {        super.onDestroy();        Log.i(TAG, "onDestroy: 执行");        EventBus.getDefault().unregister(this);    } @Subscribe(threadMode = ThreadMode.MAIN)    public void onTestMessageBean(TestMessageBean messageBean) {        Log.i(TAG, "onTestMessageBean: 接收到了" +messageBean.getMname()+messageBean.getDes());    }    @Override    public void onClick(View v) {        if (v.getId() == R.id.button4) {            Intent intent = new Intent(this, TestEventbusSend.class);            startActivity(intent);        }    }}

发送消息的activity:TestEventbusSend.class

public class TestEventbusSend extends AppCompatActivity implements View.OnClickListener {    private String TAG = "TestEventbusSend";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_eventbus_send);        Button sendButton = (Button) findViewById(R.id.button3);        sendButton.setOnClickListener(this);    }    @Override    public void onClick(View v) {        if (R.id.button3 == v.getId()) {            EventBus.getDefault().post(new TestMessageBean("name","des"));            Log.i(TAG, "onClick: 已发送");            finish();        }    }}


更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 树莓派与Android客户端进行socket通信
  3. Android触摸事件分发之View篇
  4. ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
  5. Android入门:深入学习理解 Handler HandlerThread AsyncQueryHan
  6. android viewflipper和tabhost效率对比
  7. Android学习整理- 9- 实时更新UI-Handler
  8. Android-Handler机制详解并自定义Handler
  9. Android处理按钮重复点击事件

随机推荐

  1. Android(安卓)面试题总结2018(二)
  2. Android(安卓)SmsBackUp 源码
  3. Android扮猪吃虎
  4. Android(安卓)真的能跨平台吗?
  5. Android(安卓)深入解析光传感器(一)
  6. Android高手进阶教程(二十五)之---Androi
  7. Android(安卓)应用下载量超越 iOS,开发者
  8. Android中View和ViewGroup介绍
  9. 利用android中的View来画线
  10. Android软件安全开发实践