EventBus-订阅总线
介绍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
来源:CSDN
作者:汪星没有熊
链接:https://blog.csdn.net/weixin_45697390/article/details/104674647