EventBus是一种为了优化Android组件之间事件传递的解耦工具,通过发布/订阅事件总线来实现事件在不同组件之间的事件传递。EventBus可以减少接口回调使用,避免大量内部类的产生,从而降低耦合。
compile 'org.greenrobot:eventbus:3.0.0'
如果不使用加速模式这样就够了。
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
启用插件
apply plugin: 'com.neenbedankt.android-apt'
apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
apt {
arguments {
eventBusIndex "com.bandeng.MyEventBusIndex"
}
}
然后在Rebuild Project。最后需要在Application的onCreate里添加以下代码:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
下面是SnedFragment代码:
public class SnedFragment extends Fragment {
public SnedFragment() {
}
private int count = 0;
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sned, container, false);
view.findViewById(R.id.btn_send_lv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
//这一句就是发送数据
EventBus.getDefault().post(new MessageEvent("第"+count+"条信息");
}
});
return view;
}
}
public class ReceiverFragment extends Fragment {
private ListView lv_receiver;
private List list;
private ArrayAdapter adapter;
public ReceiverFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_receiver, container, false);
lv_receiver = view.findViewById(R.id.lv_receiver);
list = new ArrayList<>();
adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, list);
lv_receiver.setAdapter(adapter);
//注册EventBus
EventBus.getDefault().register(this);
return view;
}
//订阅信息,post过来的信息将在这里被接收
@Subscribe
public void getMessage(MessageEvent event) {
list.add(event.getMessage());
adapter.notifyDataSetChanged();
}
@Override
public void onStop() {
super.onStop();
//取消注册EventBus
EventBus.getDefault().unregister(this);
}
}
view.findViewById(R.id.btn_send_toast).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new ToastEvent("第"+count+"条信息");
}
});
在ReceiverFragment里添加一个方法用于接收ToastEvent
@Subscribe
public void getMessage2(ToastEvent event) {
Toast.makeText(getActivity(), event.getMsg(), Toast.LENGTH_SHORT).show();
}
下面是运行结果
@Subscribe(priority = 1)
public void getMessage_1(MessageEvent event) {
list.add(event.getMessage());
adapter.notifyDataSetChanged();
}
@Subscribe(priority = 2)
public void getMessage_2(MessageEvent event) {
EventBus.getDefault().cancelEventDelivery(event);
list.add(event.getMessage());
adapter.notifyDataSetChanged();
}
@Subscribe(priority = 3)
public void getMessage_3(MessageEvent event) {
list.add(event.getMessage());
adapter.notifyDataSetChanged();
}
下面是运行结果,可以看到在listview中只添加了2项数据,说明priority为2的方法拦截掉了event,导致
priority为1与之前优先级默认为的0方法都接不到消息。
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
//设置为可接收粘性事件
@Subscribe(sticky = true)
public void receiver(StickyMessgae msg){
TextView tv = (TextView) findViewById(R.id.tv_text);
tv.setText(msg.getMsg());
}
}
EventBus.getDefault().postSticky(new StickyMessgae("第"+count+"条信息");