Android EventBus使用

本文介绍了如何使用EventBus替代Intent、Handler和Broadcast进行Android模块间的通信和与后台线程交互,详细讲解了EventBus的配置、消息发送、事件接收及线程模式的应用,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
 
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(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();
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值