android EventBus 使用
来源:互联网 发布:linux arp incomplete 编辑:程序博客网 时间:2024/05/29 18:36
ThreadMode:POSTING
默认类型.将会在发送事件的线程执行,当事件发送完成,将同步交付给所有监听该事件的监听者,推荐用于那些很短时间完成且不需要在主线程运行的任务,事件处理必须尽快完成,否则可能会阻塞事件发送线程(有可能是主线程),将会导致事件分发延迟。
ThreadMode:MAIN
将会在主线程执行,如果本身是在主线程发送的事件,事件处理方法将会直接调用它。时间处理必须尽快完成,避免阻塞主线程
ThreadMode:BACKGROUND
将会在后台线程执行,如果事件不是在主线程发送的,将会直接在发送它的线程调用它,如果是在主线程发送,EventBus 将会将它们在一个单独的后台线程按次序处理,事件处理应当尽快完成,以免阻塞后台线程.
ThreadMode:ASYNC
事件处理方法将会在一个单独的线程调用,它总是与发送它的线程和主线程不同,发送线程永远不会因为它的处理而等待,如果事件处理需要大量时间可以使用该模式,避免同一时间有大量异步的事件处理线程执行,EventBus 使用线程池来完成任务.
StickyEvent
总是会保留最后一次发送的事件
定义事件
package example.com.eventbusdemo;public class Event { private String msg; Event(String msg){ this.msg=msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg =msg; }}
注册,发送,接收事件
public class MainActivity extends AppCompatActivity { public static String TAG="EVENTBUSLOG"; EventBus bus=EventBus.getDefault(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bus.register(this); Log.d(TAG, "主线程:" + Thread.currentThread().getId()); String msg="创建:"+Thread.currentThread().getId()+"MainThread"; Event event=new Event(msg); bus.post(event); new WorkThread().start(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(Event event){ Log.d(TAG, "MAIN 运行:" +Thread.currentThread().getId()+ event.getMsg()); } @Subscribe(threadMode = ThreadMode.BACKGROUND,sticky = true) public void onBackThread(Event event){ Log.d(TAG, "BACK 运行:"+Thread.currentThread().getId()+event.getMsg()); } @Subscribe(threadMode = ThreadMode.ASYNC) public void onAsync(Event event){ Log.d(TAG, "ASYNC 运行:" + Thread.currentThread().getId() + event.getMsg()); } @Subscribe(threadMode = ThreadMode.POSTING) public void onPostiong(Event event){ Log.d(TAG, "POSTING 运行:"+Thread.currentThread().getId()+event.getMsg()); } @Override protected void onDestroy() { super.onDestroy(); bus.unregister(this); } class WorkThread extends Thread { @Override public void run() { String msg="创建:"+getId()+"WorkThread"; Event event=new Event(msg); bus.post(event); } }}
结果
02-19 07:30:24.799 2139-2139/example.com.eventbusdemo D/EVENTBUSLOG﹕ 主线程:1
02-19 07:30:24.800 2139-2139/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1创建:1MainThread
02-19 07:30:24.800 2139-2139/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:1创建:1MainThread
02-19 07:30:24.806 2139-2155/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:113创建:113WorkThread
02-19 07:30:24.806 2139-2155/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:113创建:113WorkThread
02-19 07:30:24.808 2139-2154/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:112创建:1MainThread
02-19 07:30:24.815 2139-2157/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:114创建:1MainThread
02-19 07:30:24.816 2139-2153/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:111创建:113WorkThread
02-19 07:30:24.818 2139-2139/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1创建:113WorkThread
StickyEvent
Event stickyEvent=new Event("sticky 1"); Event stickyEvent2=new Event("sticky 2"); bus.postSticky(stickyEvent); bus.postSticky(stickyEvent2); Button button=(Button)findViewById(R.id.send_event); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, AnotherActivity.class); startActivity(intent); } });
AnotherActivity
public class AnotherActivity extends AppCompatActivity { public static String TAG="AnotherTag"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_another); } @Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Subscribe(sticky = true) public void onEvent(Event event){ Log.d(TAG, event.getMsg()) ; } @Subscribe void onMainEvent(Event event){ Log.d(TAG, event.getMsg()) ; } @Override protected void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }}
运行结果
02-19 07:34:38.547 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ 主线程:1
02-19 07:34:38.547 4206-4222/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:167创建:1MainThread
02-19 07:34:38.547 4206-4223/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:168创建:1MainThread
02-19 07:34:38.547 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1创建:1MainThread
02-19 07:34:38.547 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:1创建:1MainThread
02-19 07:34:38.548 4206-4222/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:167sticky 1
02-19 07:34:38.548 4206-4223/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:168sticky 1
02-19 07:34:38.548 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1sticky 1
02-19 07:34:38.548 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:1sticky 1
02-19 07:34:38.548 4206-4222/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:167sticky 2
02-19 07:34:38.548 4206-4223/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:168sticky 2
02-19 07:34:38.548 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1sticky 2
02-19 07:34:38.548 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:1sticky 2
02-19 07:34:38.550 4206-4222/example.com.eventbusdemo D/EVENTBUSLOG﹕ ASYNC 运行:167创建:175WorkThread
02-19 07:34:38.550 4206-4703/example.com.eventbusdemo D/EVENTBUSLOG﹕ BACK 运行:175创建:175WorkThread
02-19 07:34:38.550 4206-4703/example.com.eventbusdemo D/EVENTBUSLOG﹕ POSTING 运行:175创建:175WorkThread
02-19 07:34:38.641 4206-4206/example.com.eventbusdemo D/EVENTBUSLOG﹕ MAIN 运行:1创建:175WorkThread
可以看出,发送 stickyEvent 时,没有指定 sticky=true 的接收方法也可以接收,在开启另一个 Activity 前发送了两个 StickyEvent ,而在那 Activity 中只有指定了 sticky 的接收到了事件,且是之前最后发送的事件
- Android - EventBus使用 备忘
- android EventBus 使用
- Android EventBus 使用详解
- Android EventBus使用详解
- Android EventBus的使用
- Android使用EventBus
- android EventBus的使用
- Android-eventBus的使用
- Android EventBus的使用
- Android EventBus 基本使用
- Android EventBus的使用
- Android EventBus使用详解
- Android EventBus 3.0使用
- android EventBus的使用
- android EventBus使用 总结
- android-eventbus-使用详解
- Android EventBus使用总结
- Android -- EventBus使用
- SharedPreference的使用
- Nodejs学习路线图
- Poj 3254 Corn Fields
- Ubuntu14.04安装tomcat7.0和jdk1.7
- leetcode-48.Rotate Image 解法
- android EventBus 使用
- Double的加减乘除
- linux io 阻塞,非阻塞,同步,异步
- uboot 之uboot.lds分析
- bootm命令中地址参数,内核加载地址以及内核入口地址
- 7、Maven的继承
- spring InitializingBean init-method postConstruct 执行顺序
- 新安装CCS 后编译出现问题:gmake:No rule to make target clean
- Mac安装MySQL初始密码设置