美文网首页
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事件总线程

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