使用Rxjava Android从Activity更新片段

Zul*_*utt 16 android android-fragments android-activity rx-android rx-binding

我有一个简单的用例,其中:

  • Activity1创建一个fragment1

  • 创建后的fragment1通知活动它是否已创建并更新其activity1视图.

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

我正在使用rxandroid,sublibrary rxlifecycle组件和android,但我还在学习阶段,rx-lifecyclestackoverflow上甚至没有标记,所以我仍然在努力理解这个库的流程..

编辑

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

Gre*_*eek 6

需要考虑的两点:

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

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

通过使用事件总线,您可以通过将整个过程与Android生命周期取消关联来大大简化操作.

  • 或者您可以接收一些包含事件类型的BaseEvent,然后使用"命令"设计模式 - 在地图中存储该事件的处理程序,选择正确的事件并处理该事件.重构代码时我必须这样做一次 (2认同)

小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从您的片段中调用:

SampleEventsBus.getInstance().postFragmentAction(SampleEventsBus.ACTION_FRAGMENT_CREATED);
Run Code Online (Sandbox Code Playgroud)

来自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
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助.