android EventBus 使用

本文详细介绍了Android EventBus中四种线程模式(POSTING、MAIN、BACKGROUND、ASYNC)的特性及StickyEvent的概念,通过实例展示了它们在事件处理中的实际应用与效果。
摘要由CSDN通过智能技术生成

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 的接收到了事件,且是之前最后发送的事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值