EventBus的介绍和使用
- EventBus的介绍
- 作用
- 引入
- 成员
- 综合小案例:
- 1,Activity中的布局:
- 2 Activity中的代码:
- 3 fragment中的代码:
- 4 .fragment中的布局只有一个textView 不放代码了.
- 线程模型
- 线程模型的用处:
- 官方网址:
EventBus的介绍
EventBus是一种用于Android的事件发布-订阅总线作用
它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。引入
成员implementation 'org.greenrobot:eventbus:3.2.0'
最新版本可以去官网查看
使用EventBus主要涉及三个成员:
- 发送者
用来在任意线程中,发送数据,参数是Objcet类型.
java EventBus.getDefault().post(Object o);
- 接收者
用来接收数据.但是接收之前需要在当前的页面注册和注销,方法如下:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
- 事件
可以简单的理解为,需要发送的消息内容,建议封装成一个对象.
public class MessageEvent { /* Additional fields if needed */ }
就是接收者虽然通过注册方式注册成功了,但是还需要一个方法用来接收发送者传来的数据: 方法如下:
/**
* 方法名称随意.
* @param s 发送的参数是什么,接收的参数就是什么.
*/
@Subscribe
public void getMsg(String s){
fgText.setText(s);
}
仔细观察这个方法,发现有一个 @Subscribe 这个注解就是EventBus给提供的.作用是来表示此方法是用来接收数据的. 发送者的数据,就是这个方法的参数.所有方法参数要与发送者发送的数据类别保持一致.
此外 这个@Subscribe 注解还可以控制,此方法是运行在ui线程还是子线程中.稍后说明.
综合小案例:
到此,EventBus已经可以简单实用了,我们在做一个如下的案例.
要求,在一个Activity中,有一个输入框,一个button,一个fragment
,我们用EventBus 来显示 Activity给fragment传值.
布局和要求如下:
文章图片
代码如下:
1,Activity中的布局:
2 Activity中的代码:
package com.fenghongzhang.day012;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.greenrobot.eventbus.EventBus;
public class BusActivity extends AppCompatActivity {
private EditText edit;
private Button sendContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus);
edit = (EditText) findViewById(R.id.edit);
sendContent = (Button) findViewById(R.id.sendContent);
sendContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = edit.getText().toString();
EventBus.getDefault().post(s);
}
});
}
}
3 fragment中的代码:
package com.fenghongzhang.day012;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
/**
* A simple {@link Fragment} subclass.
*/
public class BlankFragment extends Fragment {
private TextView fgText;
public BlankFragment() {
// Required empty public constructor
}
//@Override
//public void onCreate(@Nullable Bundle savedInstanceState) {
//super.onCreate(savedInstanceState);
//EventBus.getDefault().register(this);
//}@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_blank, container, false);
fgText = (TextView) inflate.findViewById(R.id.fg_text);
//fgText.setText(?);
return inflate;
}
/**
* 方法名称随意.
* @param s 发送的参数是什么,接收的参数就是什么.
*/
@Subscribe
public void getMsg(String s){
fgText.setText(s);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
}
4 .fragment中的布局只有一个textView 不放代码了. 线程模型
EventBus3.0有四种线程模型,分别是:
1, POSTING: 默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
2, MAIN: 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
3, BACKGROUND: 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
4, ASYNC: 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作
线程模型的用处: 因为发送者是可以在任意线程中发送数据的,那么相对的接收者也是可以在任意线程中接收数据,
因为涉及到更新ui或耗时操作的问题,所以要给接收者指定在什么线程中接收.
代码如下:
/**
* 方法名称随意.-
* @param s 发送的参数是什么,接收的参数就是什么.
*/
//默认的线程模型
@Subscribe
public void getMsg(String s){
fgText.setText(s);
}
//不是发送者是什么线程,我接收者都是在 主 线程中.
@Subscribe(threadMode = ThreadMode.MAIN)
public void getMsg(String s){
fgText.setText(s);
}
//不是发送者是什么线程,我接收者都是在 子 线程中.
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void getMsg(String s){
fgText.setText(s);
}
官方网址:
https://github.com/greenrobot/EventBus【EventBus的介绍和使用】参考链接:
链接:https://www.jianshu.com/p/e7d5c7bda783