EventBus的配置:
1、访问官网:
https://github.com/greenrobot/EventBus
EventBus线程说明:
POSTING:发布在哪个线程,那么订阅处理一定会在同一个线程进行处理
MAIN:订阅处理回调函数在主线程进行处理
MAIN_ORDERED:和上面的一样的功能,但是他们俩是有差别的
BACKGROUND:订阅处理回调函数在后台进行处理
ASYNC:我的订阅回调函数一定会在独立运行而且新开的线程
而EventBus的基本使用:
1、注册和解除:可以在订阅处理方中选择一对生命周期进行:
//事件注册
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
//解除注册
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
2、定于事件对象
public class SuccessEvent {
....
}
public class FailureEvent {
...
}
3、在发布执行事件的发生,并通过EventsBus去告诉订阅方
public class PublisherDialogFragment extends DialogFragment {
//标签
private static final String TAG="PublisherDialogFragment";
private OnEventListener mlistener;
public interface OnEventListener{
void onSuccess();
void onFailure();
}
public void setEventListener(OnEventListener listener){
mlistener=listener;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
final AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
builder.setTitle("Publisher");
final String[] items={"Success","Failure","Posting"};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case 0:
EventBus.getDefault().post(new SuccessEvent());
break;
case 1:
EventBus.getDefault().post(new FailureEvent());
break;
case 2:
EventBus.getDefault().post(new PostingEvent(Thread.currentThread().toString()));
break;
}
}
});
return builder.create();
}
}
4、在订阅方进行回调的处理
@Subscribe
public void onSuccessEvent(SuccessEvent event){
setImageSrc(R.drawable.ic_happy);
}
@Subscribe
public void onFailureEvebt(FailureEvent event){
setImageSrc(R.drawable.ic_sad);
}
然后说下EventsBus是如何控制线程的,在注释后面添加线程的模式
@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostingEvent(PostingEvent event){
setPublisherThreadInfo(event.threadInfo);
setSubscriberThreadInfo(Thread.currentThread().toString());
}
回到开始所说的MAIN和MAIN_ORDERED的区别,他们共同性:使订阅方总在主线程进行处理,但他们的区别在哪里呢?
MAIN的执行顺序是发布方发送-->订阅方处理-->订阅方处理完成-->发布方执行完成
而MAIN_ORDERED的执行顺序是发布方发送-->发布方执行完成-->订阅方处理-->订阅方处理完成
注意他们的顺序,会发现,MAIN会阻塞线程,一定要等到订阅方处理完成之后,发布方才可以执行完成,而MAIN_ORDERED就比较通人性了,我发完就进行发下一个,就不等你了。
然后说下post和postSticky的区别
EventBus.getDefault().post(new MainEvent(Thread.currentThread().toString()));
EventBus.getDefault().postSticky(new MainEvent(Thread.currentThread().toString()));
post会使组件的通讯按照事件-->订阅-->发布进行,
而postSticky是事件-->发布-->订阅进行,同时postSticky的订阅回调注释需要增加为sticky = true
@Subscribe(sticky = true)
public void onSuccessEvent(SuccessEvent event){
setImageSrc(R.drawable.ic_happy);
}
然后,有点需要大家注意的,就是通过EventsBus订阅回调的方法都是显示为未调用的状态
image.png
如果你的项目在build.gradle中设置如下:
image.png
会进入极度压缩的状态,那么你通过EventsBus订阅回调的方法很有可能就会被误删,所以可以在官网中找到这段代码
image.png
然后在proguard-rules的文件进行粘贴就可以了!!
好了,到此结束,最近会继续研究kotlin大法,后面所说到的框架,我会尽量用kotlin进行展示,感谢各位客官的观看!!
网友评论