EventBus初识

1 使用方式

注册

EventBus.getDefault().register(this);

定义消息类型

public class EventA {

    String message;

    public EventA(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

接收通知的回调

 @Subscribe
    public void onEventReceive(EventA eventA) {
       
    }

解绑

EventBus.getDefault().unregister(this);

发送

 EventBus.getDefault().post(new EventA("message"));

2 示例

  • 在MainActivity中启动SecondActivity。
  • 在MainActivity中重写带有@Subscribe注释的方法,用于接收事件的回调。
  • 在SecondActivity中发送事件。

接收方

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);

        Button button = findViewById(R.id.btn_main_start);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });

    }

    @Subscribe
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity",eventA.getMessage());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

发送方

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Button button = findViewById(R.id.btn_second_send);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new EventA("send message from SecondActivity"));
            }
        });


    }
}

当点击SecondActivity中的按钮后,会在log中看到

I/TAG-MainActivity: send message from SecondActivity

3 控制接收方法运行的线程

public enum ThreadMode {
    POSTING,//和发送线程在同一个线程
    MAIN, //运行在主线程
    BACKGROUND, //运行在子线程
    ASYNC //和发送线程分离的线程池中
}

POSTING:订阅者的方法将会运行在发布所在的线程,这种模式是默认的。在此回调方法中的处理也要尽量的快。因为发布所在的线程可能是主线程。

MAIN:订阅者的方法将会在主线程中被调用,在此回调方法中要尽量快,以避免阻塞主线程。

BACKGROUND:订阅者的方法将会在工作线程中调用,如果发布所在的线程不是主线程,那么订阅者的方法会直接在此线程中调用。如果发布所在线程是主线程,事件将会在线程中去执行。在此线程中处理的内容要尽量的快,以避免阻塞此工作线程。

ASYNC:将会运行在和发布所在线程分离的线程池中。在回调方法中可以执行耗时的操作,比如网络访问等。为了避免启动多个耗时操作会限制并发数量,所以采用线程池来提高效率。

默认和发布线程在同一个线程中运行
默认的是和发送通知的线程运行在同一个线程即(threadMode = ThreadMode.POSTING)

添加在接收的方法中查看线程代码,其他不变。

@Subscribe
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());        
    }

运行结果

I/TAG-MainActivity: currentThread name:main

POSTING

在主线程中发送

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new EventA("send message from SecondActivity"));
            }
        });
@Subscribe(threadMode = ThreadMode.POSTING)
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());        
    }

打印结果:

I/TAG-MainActivity: currentThread name:main

可以看到接收方法运行在主线程。
在子线程中发送

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        EventBus.getDefault().post(new EventA("send message from SecondActivity"));
                    }
                }.start();

            }
        });

接收

@Subscribe(threadMode = ThreadMode.POSTING)
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());        
    }

打印结果

I/TAG-MainActivity: currentThread name:Thread-1722

MAIN

修改接收方法的注释参数后

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
    }

在主线程中发送的打印结果

I/TAG-MainActivity: currentThread name:main

在子线程中发送的打印结果

I/TAG-MainActivity: currentThread name:main

BACKGROUND

@Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
    }

在主线程中发送的打印结果

 I/TAG-MainActivity: currentThread name:pool-1-thread-1

在子线程中发送的打印结果

I/TAG-MainActivity: currentThread name:Thread-1742

ASYNC

 @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onEventReceive(EventA eventA) {
        Log.i("TAG-MainActivity","currentThread name:"+Thread.currentThread().getName());
    }

在主线程中发送的打印结果

 I/TAG-MainActivity: currentThread name:pool-1-thread-1

打印子线程的线程名称

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                         Log.i("TAG-SecondActivity","currentThread name:"+Thread.currentThread().getName());
                        EventBus.getDefault().post(new EventA("send message from SecondActivity"));
                    }
                }.start();

            }
        });

在子线程中发送的打印结果

I/TAG-SecondActivity: currentThread name:Thread-1763
I/TAG-MainActivity: currentThread name:pool-1-thread-1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值