美文网首页
EventBus事件总线程

EventBus事件总线程

作者: jeffrey12138 | 来源:发表于2020-09-08 16:33 被阅读0次

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进行展示,感谢各位客官的观看!!

相关文章

  • EventBus解析

    EventBus使用 EventBus是一个事件发布/订阅的框架,它能够简化各组件,异步线程和主线程的通信,Eve...

  • EventBus

    EventBus:事件总线 用处:跨模块,跨线程通信 可以替代holder 三(4)要素: Event事件 su...

  • EventBus事件总线程

    EventBus的配置:1、访问官网:https://github.com/greenrobot/EventBus...

  • Android Eventbus原理简介

    一、简介 EventBus是一款事件总线开源库,在Activity和Fragment、线程、服务等之间高效传递事件...

  • EventBus框架初解

    EventBus其实解决了这样几个问题:保存订阅者、发布事件、切换线程、粘性事件 保存订阅者 在register(...

  • EventBus 事件线程切换原理

    今天学习了一下EventBus 的源码,将其在接收事件时指定线程执行的大致原理梳理了一下,提炼整理,作为学习总结,...

  • otto初体验

    在这之前用过EventBus,发现到处都可以postEvent,事件的订阅者也可以指定线程。支持不同线程,先后台互...

  • EventBus解读

    EventBus 基础发布者通过EventBus发布事件,订阅者通过EventBus订阅事件。当发布者发布事件时,...

  • 第三方开源库 EventBus - 源码分析和手写

    EventBus官方介绍为一个为Android系统优化的事件订阅总线,它不仅可以很方便的在同线程中传递事件或者对象...

  • 第三方开源库 EventBus - 源码分析和手写

    EventBus官方介绍为一个为Android系统优化的事件订阅总线,它不仅可以很方便的在同线程中传递事件或者对象...

网友评论

      本文标题:EventBus事件总线程

      本文链接:https://www.haomeiwen.com/subject/fffvsktx.html