17

我有一个简单的用例:

  • Activity1 创建一个fragment1

  • 创建后的 fragment1 通知活动它已创建并更新其活动 1 视图。

  • 收到通知更新 fragment1 视图后的活动 1。

我正在使用 rxandroid ,子库rxlifecycle组件和 android ,但我仍处于学习阶段,rx-lifecyclestackoverflow 上什至没有标签,所以我仍在努力理解这个库的流程..

编辑

我不喜欢使用 EventBus ,这就像每个人都在喊每个人做某事一样,所以 Rxjava Observable 方法将非常有用

4

2 回答 2

6

需要考虑的两点:

  1. 仅仅因为您使用 EventBus 并不意味着它必须是全局的。如果需要,您可以拥有多个事件总线,并且您可以在两个组件(Activity 和 Fragment)之间共享一个。

  2. RxJava 文档中有几个示例展示了如何使用 RxJava 实现事件总线功能

通过使用事件总线,您可以将整个过程与 Android 生命周期分离,从而大大简化事情。

于 2016-11-20T17:32:41.240 回答
6

为了将信息从片段发布到活动,您应该使用事件总线来通知活动有关片段创建(替换回调和它们创建的混乱)。

使用 RxJava 的事件总线的示例代码是:

public class SampleEventsBus {
    private static final String TAG = SampleEventsBus.class.getSimpleName();
    private static final String TAG2 = SampleEventsBus.class.getCanonicalName();

    public static final int ACTION_FRAGMENT_CREATED = 1;
    public static final int ACTION_FRAGMENT_OTHER = 2;

    private static SampleEventsBus mInstance;

    public static SampleEventsBus getInstance() {
        if (mInstance == null) {
            mInstance = new SampleEventsBus();
        }
        return mInstance;
    }

    private SampleEventBus() {}

    private PublishSubject<Integer> fragmentEventSubject = PublishSubject.create();

    public Observable<Integer> getFragmentEventObservable() {
        return fragmentEventSubject;
    }

    public void postFragmentAction(Integer actionId) {
        fragmentEventSubject.onNext(actionId);
    }
}

然后从您的片段中您可以调用:

SampleEventsBus.getInstance().postFragmentAction(SampleEventsBus.ACTION_FRAGMENT_CREATED);

onAttach()onViewCreated()或任何你喜欢的地方。

此外,在活动中,您需要将以下代码添加到事件总线:

SampleEventsBus .getInstance().getFragmentEventObservable().subscribe(new Subscriber<Integer>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer actionId) {
            if(actionId == SampleEventsBus.ACTION_FRAGMENT_CREATED) {
                //do any required action
            }
        }
    });

对于第二部分,即从活动更新片段,我不建议使用这种方法,因为它会导致不必要的复杂性,而是使用“原始方式”作为:

  1. 在 Fragment 中创建一个方法为updateView(Object obj)
  2. onNext()中,获得所需的片段为SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
  3. 称呼fragment.updateView(obj);

希望这可以帮助。

于 2016-11-28T01:54:56.080 回答