欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EventBus3.0使用

程序员文章站 2022-07-14 16:06:09
...

使用步骤

添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
定义消息事件类
public class MessageEvent {

    //里面写你自己需要传递的参数
}
事件发送者:想要发送的地方发送
EventBus.getDefault().post(new MessageEvent(...);
事件订阅者:Activity/Fragment
//1.注册事件:一般在onCreate/onStart方法中
// ... ...
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ...
    EventBus.getDefault().register(this);
}
//2.取消订阅事件
@Override
protected void onDestroy() {
    super.onDestroy();
    //取消注册事件
    EventBus.getDefault().unregister(this);
}    
//3.事件订阅者处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMoonEvent(MessageEvent messageEvent){
    //获取传递的值进行处理
    messgetEvent.getXXX();
}
// ... ...

简单例子实践运用

添加依赖库
compile 'org.greenrobot:eventbus:3.0.0'
定义消息事件类
package com.wind.eventbus_demo;
//消息事件类
public class EventMessage {
    String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public EventMessage(String text) {

        this.text = text;
    }
}

接收者
package com.wind.eventbus_demo;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

/**
 * 1.注册订阅
 * 2.处理事件
 * 3.取消订阅
 */
public class MainActivity extends AppCompatActivity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //1.注册订阅
        EventBus.getDefault().register(this);
    }

    //2.处理事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    //参数必须和发送者传递的参数是一样的:发送的是EventMessage对象,接收也是EventMessage对象
    public void getMessage(EventMessage eventMessage) {
        String text = eventMessage.getText();
        Log.e("MyLog", "MainActivity.getMessage:  接收者接收的文本: --->>> " + text);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //3.取消订阅
        EventBus.getDefault().unregister(this);
    }

    private void initView() {
        tv = (TextView) findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });
    }
}

发送者:
package com.wind.eventbus_demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        //点击返回的时候发送消息
        EventBus.getDefault().post(new EventMessage("五把XXXXX"));
    }
}
打印日志:
 E/MyLog: MainActivity.getMessage:  接收者接收的文本: --->>> 五把XXXXX

在上面的例子中,我们再注解@Subscribe(threadMode = ThreadMode.MAIN)中使用了ThreadMode.MAIN这个模式,表示该函数在主线程即UI线程中执行,实际上EventBus总共有四种线程模式,分别是:

  1. ThreadMode.MAIN:表示无论事件是在哪个线程发布出来的,该事件订阅方法onEvent都会在UI线程中执行,这个在Android中是非常有用的,因为在Android中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。

  2. ThreadMode.POSTING:表示事件在哪个线程中发布出来的,事件订阅函数onEvent就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

  3. ThreadMode.BACKGROUND:表示如果事件在UI线程中发布出来的,那么订阅函数onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。

  4. ThreadMode.AYSNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。

相关标签: EventBus