EventBus-订阅总线

橙三吉。 提交于 2020-03-06 02:57:14

介绍EventBus

EventBus是一种用于Android的事件发布-订阅总线,它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。

在EventBus中有三个重点
1、发送者
用来在任意线程中,发送数据,参数是Objcet类型.
2、接收者
用来接收数据.但是接收之前需要在当前的页面注册和注销,

@Override
public void onStart() {
    super.onStart();
    //订阅事件
    EventBus.getDefault().register(this);
}

@verride
public void onStop() {
    super.onStop();
    //退订事件
    EventBus.getDefault().unregister(this);
}

3、事件

需要发送的内容,这里也可以封装成一个对象

@Subscribe(threadMode = ThreadMode.MAIN)
public void getMsg(EvenBus e){
    tvShow.setText(e.getText());
}

这里被@Subscribe注解的方法可以理解为一个容器,里面存放的就是我们期望发送的数据或对象内容
关于后面的括号里的内容是一个设置线程的方法模型

POSTING: 默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
MAIN: 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
BACKGROUND: 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
ASYNC: 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作

案例:通过EventBus给Fragment设置EditText传来的值

Activity布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_text"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
    <Button
        android:id="@+id/btn_send"
        android:text="send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <fragment
        android:id="@+id/fg"
        android:name="com.example.eventbus.BlankFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

Activity代码:

public class MainActivity extends AppCompatActivity {
    private EditText et_text;
    private Button btnSend;

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

        et_text = (EditText) findViewById(R.id.et_text);
        btnSend = (Button) findViewById(R.id.btn_send);


        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Editable text = et_text.getText();
                EvenBus evenBus = new EvenBus();
                evenBus.setText(text.toString());
                EventBus.getDefault().post(evenBus);
            }
        });
    }
}

Fragment布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BlankFragment">

    <TextView
        android:id="@+id/tv_show"
        android:text="这是fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</FrameLayout>

Fragment代码:

/**
 * A simple {@link Fragment} subclass.
 */
public class BlankFragment extends Fragment {
    private TextView tvShow;

    public BlankFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.fragment_blank, container, false);
        tvShow = (TextView) inflate.findViewById(R.id.tv_show);

        return inflate;
    }

    @Override
    public void onStart() {
        super.onStart();
        //订阅事件
        EventBus.getDefault().register(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getMsg(EvenBus e){
        tvShow.setText(e.getText());
    }

    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }
}

官方网址

https://github.com/greenrobot/EventBus
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!