使用Rxjava Android从Activity更新片段

时间:2016-11-16 16:12:03

标签: android android-fragments android-activity rx-android rx-binding

我有一个简单的用例:

  • Activity1创建一个fragment1

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

  • 获取通知更新fragment1视图后
  • activity1。

我正在使用rxandroid,子库rxlifecycle组件和android,但我还在学习阶段,stackoverflow上甚至没有rx-lifecycle标签,所以我仍然在努力理解这个流程图书馆..

修改

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

2 个答案:

答案 0 :(得分:6)

要考虑两点:

  1. 仅仅因为你使用EventBus并不意味着它需要 全球。如果你愿意,你可以有多个活动巴士,你可以 在两个组件(活动和片段)之间共享一个。

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

  3. 通过使用事件总线,您可以通过取消整个流程与Android生命周期的关联来大大简化事情。

答案 1 :(得分: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. 在片段中创建updateView(Object obj)
  2. 的方法
  3. onNext()中,获取所需的片段SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
  4. 致电fragment.updateView(obj);
  5. 希望这有帮助。