Android(安卓)EventBus使用
16lz
2021-01-26
使用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(); } }}
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 树莓派与Android客户端进行socket通信
- Android触摸事件分发之View篇
- ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
- Android入门:深入学习理解 Handler HandlerThread AsyncQueryHan
- android viewflipper和tabhost效率对比
- Android学习整理- 9- 实时更新UI-Handler
- Android-Handler机制详解并自定义Handler
- Android处理按钮重复点击事件