GithubHelp home page GithubHelp logo

blankj / rxbus Goto Github PK

View Code? Open in Web Editor NEW
341.0 13.0 41.0 1.24 MB

:bus: The RxBus as steady as an old dog.

Home Page: https://blankj.com/2018/05/09/awesome-rxbus

License: Apache License 2.0

Java 100.00%
eventbus rxjava2 rxandroid2 rxjava rxandroid rxbus rxbus2

rxbus's Introduction

logo

rb License

Download

Gradle:

implementation "com.blankj:rxbus:1.6"

How to use

非粘性事件

  1. 注册事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册 String 类型事件
        RxBus.getDefault().subscribe(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 注册带 tag 为 "my tag" 的 String 类型事件
        RxBus.getDefault().subscribe(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}
  1. 发送事件
// 发送 String 类型事件
RxBus.getDefault().post("without tag");

// 发送带 tag 为 "my tag" 的 String 类型事件
RxBus.getDefault().post("with tag", "my tag");

粘性事件(也就是先发送事件,在之后注册的时候便会收到之前发送的事件)

  1. 发送事件
// 发送 String 类型的粘性事件
RxBus.getDefault().postSticky("without tag");

// 发送带 tag 为 "my tag" 的 String 类型的粘性事件
RxBus.getDefault().postSticky("with tag", "my tag");

// 在需要移除粘性事件的地方移除它
RxBus.getDefault().removeSticky("without tag");
RxBus.getDefault().removeSticky("with tag", "my tag");
  1. 注册事件
public class YourActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册 String 类型事件
        RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });

        // 注册带 tag 为 "my tag" 的 String 类型事件
        RxBus.getDefault().subscribeSticky(this, "my tag", new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                Log.e("eventTag", s);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}

Nice wrap

如果用到事件总线的地方比较多,那么可以把事件总线的使用放到一个 Manager 中使用,比如我 Demo 中做的封装如下所示:

public class RxBusManager {

    private static final String MY_TAG = "MY_TAG";

    public static void subscribeRxBusManagerActivity(final RxBusManagerActivity activity){
        RxBus.getDefault().subscribe(activity, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("without " + s);
            }
        });

        RxBus.getDefault().subscribe(activity, MY_TAG, new RxBus.Callback<String>() {
            @Override
            public void onEvent(String s) {
                activity.updateText("with " + s);
            }
        });
    }

    public static void postToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event);
    }

    public static void postWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().post(event, MY_TAG);
    }

    public static void postStickyToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event);
    }

    public static void postStickyWithMyTagToRxBusManagerActivity(final String event) {
        RxBus.getDefault().postSticky(event, MY_TAG);
    }

    public static void unregisterRxBusManagerActivity(final RxBusManagerActivity activity) {
        RxBus.getDefault().unregister(activity);
    }
}

可以看出这是在 RxBusManagerActivity 中要使用 RxBus 的相关代码,这样可以更方便地管理应用中所有的事件总线,而不至于发了个事件都不清楚接收方在哪的尴尬。

How it comes

网上现有 RxBus 存有的问题:

  1. 使用的 RxBus 大多停留在 RxJava1 版本
  2. RxBus 实现的粘性事件很多都是有问题的
  3. 如果事件抛了异常,之后便再也无法接收到的问题
  4. 同类型事件需自己再次封装 Bean 进行区别。

介于以上问题,我还是亲自封装一个简洁的供大家使用,库已经依赖了 RxAndroid 和 RxJava,所以导入了该库的就不需要再额外导入那两库了。

当然,如果通信频率比较高追求效率的话还是推荐使用 EventBus

Principle

  1. 利用 FlowableProcessor 既可以作为观察者又可以作为被观察者来实现事件总线
  2. 粘性事件原理就是发送的时候把事件存到一个 hash 表中,在注册的时候查询下 hash 表中是否存在符合的事件,有的话就消费掉即可
  3. 替换原有 LambdaSubscriber 来让抛了异常之后可以继续接收到后续事件
  4. 封装了 TagMessage 来区分不同类别的 tag
  5. 动态识别范型对象来省去传入 Type 类型

还有一些细节就自己看源码去了解吧,总共有用的代码不超过 300 行哈。

打个小广告

欢迎加入我的小专栏「基你太美」一起学习。

rxbus's People

Contributors

blankj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rxbus's Issues

在传递一个接口的时候会报空指针错误

public interface OnFragmentInteractionListener extends Serializable {
    void onFragmentInteraction(Bundle var1);
}

这是我的一个接口,我的MainFragment实现这个接口,然后传递出去

        // 发送带 tag 的 OnFragmentInteractionListener 类型事件
        RxBus.getDefault().postSticky(this, "MainFragment");

我的另外一个接口去接收这个数据

        // 注册带 tag  的 OnFragmentInteractionListener 类型事件
        RxBus.getDefault().subscribeSticky(this, "MainFragment", new RxBus
                .Callback<OnFragmentInteractionListener>() {
            @Override
            public void onEvent(OnFragmentInteractionListener listener) {

            }
        });

然后在接收的那个页面就报空指针了,以下是错误的log

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
                                                                                       at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:772)
                                                                                       at com.blankj.rxbus.CacheUtils.findStickyEvent(Unknown Source)
                                                                                       at com.blankj.rxbus.RxBus.subscribe(Unknown Source)
                                                                                       at com.blankj.rxbus.RxBus.subscribeSticky(Unknown Source)
                                                                                       at com.fubang.renewableresourcesclient.ui.home.BookingResultFragment.initParam(BookingResultFragment.java:61)
                                                                                       at com.qian.qianlibrary.base.fragment.BaseFragment.onResume(BaseFragment.java:104)
                                                                                       at android.support.v4.app.Fragment.performResume(Fragment.java:2390)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1474)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
                                                                                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
                                                                                       at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                                                       at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
                                                                                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
                                                                                       at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
                                                                                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
                                                                                       at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
                                                                                       at android.os.Handler.handleCallback(Handler.java:743)
                                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                       at android.os.Looper.loop(Looper.java:150)
                                                                                       at android.app.ActivityThread.main(ActivityThread.java:5621)
                                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

我相同的代码,把传递的参数从OnFragmentInteractionListener改成String或其他的实体类(只要不是接口),都是OK的,就是接口不行。我甚至可以在接收的时候直接接收这个MainFrament,然后转换成OnFragmentInteractionListener,但是就是不能以OnFragmentInteractionListener来接收

post一个List类型的数据无法正常接收到

发送事件处:
List objList = new ArrayList<>();
objList.add(new Object())
//......
RxBus.getDefault().post(wrapper);

接收事件处:
RxBus.getDefault().subscribe(this, AndroidSchedulers.mainThread(), new RxBus.Callback<List>() {
@OverRide
public void onEvent(List objList) {
Log.d("sss", String.format("Objects共%d个", objList.size()));
}
});
这个log不打印,换用Rxjava的PublishSubject可以正常接收

是否会考虑使用lifecycle自动解注册

  public static void register(FragmentActivity owner) {
    owner.getLifecycle().addObserver(new ObserverWrapper(owner));
  }
  static class ObserverWrapper implements GenericLifecycleObserver {
    LifecycleOwner mLifecycleOwner;

    public ObserverWrapper(LifecycleOwner lifecycleOwner) {
      mLifecycleOwner = lifecycleOwner;
      if (mLifecycleOwner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)) {
        register();
      }
    }

    public void register() {
      if (mLifecycleOwner != null) {
        get().register(mLifecycleOwner);
      }
    }

    public void unregiseter() {
      if (mLifecycleOwner != null) {
        get().unregister(mLifecycleOwner);
        mLifecycleOwner = null;
      }
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
      if (mLifecycleOwner.getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
        unregiseter();
        return;
      }
      if (mLifecycleOwner.getLifecycle().getCurrentState() == Lifecycle.State.CREATED) {
        register();
      }
    }
  }

使用Lambda表达式的问题

package com.blankj.rxbus.demo;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.blankj.rxbus.RxBus;

public class RxBusActivity extends AppCompatActivity {

private TextView tvSticky;

public static void start(Context context) {
    Intent starter = new Intent(context, RxBusActivity.class);
    context.startActivity(starter);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvSticky = findViewById(R.id.tv_sticky);

    RxBus.getDefault().subscribe(this, (RxBus.Callback<String>) s -> {
        tvSticky.setText(Config.appendMsg("without " + s));
        throw new NullPointerException("");
    });

    RxBus.getDefault().subscribe(this, "my tag", (RxBus.Callback<String>) s -> tvSticky.setText(Config.appendMsg("with " + s)));

    RxBus.getDefault().subscribe(this, (RxBus.Callback<TestCallback>) testCallback -> tvSticky.setText(Config.appendMsg(testCallback.call())));
}

@Override
protected void onDestroy() {
    super.onDestroy();
    RxBus.getDefault().unregister(this);
}

public void postWithoutTag(View view) {
    Config.restoreMsg();
    RxBus.getDefault().post("tag");
}

public void postWithTag(View view) {
    Config.restoreMsg();
    RxBus.getDefault().post("tag", "my tag");
}

public void postStickyWithoutTag(View view) {
    Config.restoreMsg();
    RxBus.getDefault().postSticky("tag");
    StickyTestActivity.start(this);
}

public void postStickyWithTag(View view) {
    Config.restoreMsg();
    RxBus.getDefault().postSticky("tag", "my tag");
    StickyTestActivity.start(this);
}

public void useManager(View view) {
    RxBusManagerActivity.start(this);
    finish();
}

public void testInterface(View view) {
    Config.restoreMsg();
    for (int i = 0; i < 100; i++) {
        final int finalI = i;
        RxBus.getDefault().post((TestCallback) () -> String.valueOf(finalI));
    }
}

}
报的错误
2018-09-14 00:57:27.291 9278-9278/com.blankj.rxbus.demo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.blankj.rxbus.demo, PID: 9278
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.blankj.rxbus.demo/com.blankj.rxbus.demo.RxBusActivity}: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at com.blankj.rxbus.Utils.getTypeClassFromCallback(Utils.java:49)
at com.blankj.rxbus.RxBus.subscribe(RxBus.java:125)
at com.blankj.rxbus.RxBus.subscribe(RxBus.java:72)
at com.blankj.rxbus.demo.RxBusActivity.onCreate(RxBusActivity.java:29)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

接收问题

遇到发送事件一次,接收的时候,接收到了两次

CacheUtils存在内存泄漏,即使是我没有使用RxBus的页面

存在泄漏的界面有
MineFragment,
HomeFragment,
OrderFragment,
AppointmentOrderFragment,
VisitOrderFragment,
InformationFragment。
他们的结构是主体是MainFragment。其他如HomeFragment,OrderFragment,InformationFragment,MineFragment是MainFragment中的子模块。VisitOrderFragment和AppointmentOrderFragment是另外添加到Activity上覆盖MainFragment的页面。
我在MainFragment发出带标签的粘性事件,在HomeFragment中接收,其他页面都没有相关RxBus操作
代码如下:

发送:
RxBus.getDefault().postSticky(this, "MainFragment");//发送的MainFragment本身实现的接口
@OverRide
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
// 注销
RxBus.getDefault().unregister(this);
}

接收:
RxBus.getDefault().subscribeSticky(this, "MainFragment", new RxBus
.Callback() {
@OverRide
public void onEvent(OnFragmentInteractionListener listener) {
HomeFragment.this.listener = listener;
}
});
@OverRide
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
// 注销
RxBus.getDefault().unregister(this);
}

screenshot_2018-09-13-11-05-22
screenshot_2018-09-13-11-05-28
screenshot_2018-09-13-11-05-34
screenshot_2018-09-13-11-05-38
screenshot_2018-09-13-11-05-47
screenshot_2018-09-13-11-06-05
screenshot_2018-09-13-11-06-17

Sticky Event

请问博主,我在1.5的版本发送StickyEvent后,可以个地方被消费,但是1.6里面只要有一个地方消费了,这个event在其他地方就不会被消费了,代码不执行。 请问1.6里面有啥办法可以多次消费呢,然后在最后都不需要的时候我再去removeSticky 。

subscribe 时出现 ClassCastException

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at .utils.rxbus.RxUtils.getClassFromCallback(RxUtils.java:49)
at .utils.rxbus.RxBus.subscribe(RxBus.java:129)
at .rxbus.RxBus.subscribe(RxBus.java:73)
at .MenuDialog.init(MenuDialog.java:122)

关于databinding的问题

关于databinding的问题,如果该页面使用rxbus接收了其他页面发送过来的事件后,在使用databinding无法更新页面,很是奇怪

粘性事件,无法清除

只要注册和发送一个粘性事件,不管是退出界面
还是退出应该,都无法清除这个事件。
这样就会造成只要一打开这个界面,都会找到这个粘性事件发出的通知,
public void unregister(final Object subscriber) {
CacheUtils.getInstance().removeDisposables(subscriber);
}
只是清除了注册的Disposable
但是,粘性事件的
Map<Class, List> stickyEventsMap = new ConcurrentHashMap<>();
并没有清除,因为,Map 的key是Callback

所以建议,提供一个方法,指定回收粘性事件或全部回收粘性事件

一个界面注册String和Long的粘性标签事件,Long数据无法接受

我在AActivity中发送两个事件
// 发送带 tag 的 String 类型事件
RxBus.getDefault().postSticky("粘性标签事件A", "ATag");
// 发送带 tag 的 String 类型事件
RxBus.getDefault().postSticky(123456L, "ATag_another");
在BActivity中接收这两个事件

        RxBus.getDefault().subscribeSticky(this, "ATag", new RxBus
                .Callback<String>() {
            @Override
            public void onEvent(String event) {
                if (text6 != null)
                    text6.setText(event);
            }
        });

        RxBus.getDefault().subscribeSticky(this, "ATag_another", new RxBus
                .Callback<Long>() {
            @Override
            public void onEvent(Long event) {
                if (text7 != null)
                    text7.setText(event+“”);
            }
        });

不管我两个事件都发送还是只发送一个Long的事件 在B中都接收不到Long的数据。而我将第二个粘性事件从Long类型改为String 那么在B中都可以接收到。

粘性事件只能被消费一次吗?

举例来说,我有三个Activity分别是A、B、C。我从A发送一个粘性事件,然后启动B,B注册了事件,能收取到A发来的事件,我再从B启动C,C注册了同样的事件,但是却都收不到A发出的事件。
以下是我三个Activity的代码

public class RxBusAActivity extends BaseActivity {


    @BindView(R.id.text3)
    TextView text3;
    @BindView(R.id.text4)
    TextView text4;
    @BindView(R.id.text5)
    TextView text5;
    @BindView(R.id.text6)
    TextView text6;
    @BindView(R.id.text7)
    TextView text7;

    /**
     * 粘性事件(也就是先发送事件,在之后注册的时候便会收到之前发送的事件)
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);

    }

    @Override
    public int getLayout() {
        return R.layout.activity_rxbusa;
    }

    @Override
    public void initParam() {
        subscribe();
        rsubscribeTag();
    }

    @OnClick({R.id.text3, R.id.text4, R.id.text5})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.text3:
                // 发送 String 类型事件
                RxBus.getDefault().postSticky(new Event("粘性事件A"));
                break;
            case R.id.text4:
                // 发送带 tag 的 String 类型事件
                RxBus.getDefault().postSticky(new Event("粘性标签事件A"), "ATag");
                break;
            case R.id.text5:
                Intent intent = new Intent(RxBusAActivity.this, RxBusBActivity.class);
                startActivity(intent);
                break;
        }
    }

    private void subscribe() {
        // 注册 String 类型事件
        RxBus.getDefault().subscribe(this, new RxBus.Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text6 != null)
                    text6.setText(event.getEvent());
            }
        });
    }

    private void rsubscribeTag() {
        // 注册带 tag 的 String 类型事件
        RxBus.getDefault().subscribe(this, "BTag", new RxBus.Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text7 != null)
                    text7.setText(event.getEvent());
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}



public class RxBusBActivity extends BaseActivity {
    @BindView(R.id.text1)
    TextView text1;
    @BindView(R.id.text2)
    TextView text2;
    @BindView(R.id.text3)
    TextView text3;
    @BindView(R.id.text4)
    TextView text4;
    @BindView(R.id.text5)
    TextView text5;
    @BindView(R.id.text6)
    TextView text6;

    @Override
    public int getLayout() {
        return R.layout.activity_rxbusb;
    }

    @Override
    public void initParam() {
        subscribe();
        rsubscribeTag();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.text1, R.id.text2, R.id.text3, R.id.text4})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.text1:
                // 发送 String 类型事件
                RxBus.getDefault().post(new Event("事件B"));
                break;
            case R.id.text2:
                // 发送带 tag 的 String 类型事件
                RxBus.getDefault().post(new Event("标签事件B"), "BTag");
                break;
            case R.id.text3:
                Intent intent = new Intent(RxBusBActivity.this, RxBusCActivity.class);
                startActivity(intent);
                break;
            case R.id.text4:
                finish();

                break;

        }
    }

    private void subscribe() {
        // 注册 String 类型事件
        RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text5 != null)
                    text5.setText(event.getEvent());
            }
        });
    }

    private void rsubscribeTag() {
        // 注册带 tag  的 String 类型事件
        RxBus.getDefault().subscribeSticky(this, "ATag", new RxBus
                .Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text6 != null)
                    text6.setText(event.getEvent());
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}




public class RxBusCActivity extends BaseActivity {
    @BindView(R.id.text1)
    TextView text1;
    @BindView(R.id.text2)
    TextView text2;
    @BindView(R.id.text3)
    TextView text3;
    @BindView(R.id.text4)
    TextView text4;
    @BindView(R.id.text5)
    TextView text5;

    @Override
    public int getLayout() {
        return R.layout.activity_rxbusc;
    }

    @Override
    public void initParam() {
        subscribe();
        rsubscribeTag();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.text1, R.id.text2, R.id.text3})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.text1:
                // 发送 String 类型事件
                RxBus.getDefault().post(new Event("事件C"));
                break;
            case R.id.text2:
                RxBus.getDefault().post(new Event("标签事件C"),"CTag");
                break;
            case R.id.text3:
                finish();
                break;
        }
    }

    private void subscribe() {
        // 注册 String 类型事件
        RxBus.getDefault().subscribeSticky(this, new RxBus.Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text4 != null)
                    text4.setText(event.getEvent());
            }
        });
    }

    private void rsubscribeTag() {
        // 注册带 tag  的 String 类型事件
        RxBus.getDefault().subscribeSticky(this,"ATag", new RxBus
                .Callback<Event>() {
            @Override
            public void onEvent(Event event) {
                if (text5 != null)
                    text5.setText(event.getEvent());
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销
        RxBus.getDefault().unregister(this);
    }
}

Gradle编译错误 紧急!!!

FAILURE: Build failed with an exception.

  • What went wrong:
    Could not resolve all files for configuration ':app:debugCompileClasspath'.

Could not find bus.jar (com.blankj:bus:1.0).
Searched in the following locations:
https://jcenter.bintray.com/com/blankj/bus/1.0/bus-1.0.jar

之前用1.0版本一直没事,到了今天下午一直编译失败,现在项目卡在这里,什么也做不了!
重新依赖1.5,删除1.0版本依赖,还是出现这个问题!大神你看能不能解决下,跪谢了!

返回栈最上方的Activity发送事件后,返回栈最底下(中间隔了好几个Activity)的订阅者无法接收到订阅事件

大佬,请教一个问题

HomeActivity首页由多个Fragment组成,通过 NavigationController切换。
在HomeActivity中如下订阅事件:

RxBusManager.subscribeEnquiryOrOrderList(this, new RxBus.Callback<String>() {
    @Override
    public void onEvent(String s) {
        switch (s) {
            case ENQUIRY_AUTO:
                navigationController.setSelect(1);
                checkPriceListFragment.jump(s);
                break;
            case ENQUIRY_MANUAL:
                navigationController.setSelect(1);
                checkPriceListFragment.jump(s);
                break;
            case ORDER_AUTO:
                navigationController.setSelect(2);
                orderFragment.jump(s);
                break;
            case ORDER_MANUAL:
                navigationController.setSelect(2);
                orderFragment.jump(s);
                break;
        }
    }
});

然后连续打开了3个Activity,在第三个Activity中发送事件,并依次finish这3个Activity。

//跳转到人工询价列表
RxBusManager.postToEnquiryOrOrderList(ENQUIRY_MANUAL);
ActivityManager.removeActivitis(new String[]{"CActivity", "BActivity", "AActivity"});

但是HomeActivity并不会接收到该事件,这是什么原因?是我的使用方式有问题吗?

我在只跨一个Activity的情况下,这种使用方式是可行的,而且是先调用finish再发送订阅事件。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.