使用 Rxjava Android 从 Activity 更新片段
Updating fragment from Activity Using Rxjava Android
我有一个简单的用例:
Activity1 创建片段1
fragment1 创建后通知 activity 它已创建并更新其 activity1 个视图。
activity1 收到通知后更新 fragment1 观看次数。
我正在使用 rxandroid,子库 rxlifecycle
组件和 android,但我仍处于学习阶段,Whosebug 上什至没有 rx-lifecycle
标签,所以我还在努力理解这个库的流程..
编辑
我不想用 EventBus ,就像大家喊着大家做某事一样,所以 Rxjava Observable 的方法会很有用
需要考虑的两点:
仅仅因为你使用了 EventBus 并不意味着它需要
全球的。如果你愿意,你可以有多个事件总线,你可以
在两个组件(Activity 和 Fragment)之间共享一个。
RxJava 文档中有几个示例显示
如何使用 RxJava
实现事件总线功能
通过使用事件总线,您可以将整个过程与 Android 生命周期分离,从而大大简化事情。
要将信息从片段发布到 activity,您应该使用事件总线通知 activity 片段创建(替换回调和它们创建的混乱)。
使用 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()
或您喜欢的任何地方。
此外,在 activity 中,您需要将以下代码放入您的事件总线:
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
}
}
});
对于第二部分,即从 activity 更新片段,我不建议使用这种方法,因为它会导致不必要的复杂性,而是使用 "original way" 作为:
- 在 Fragment 中创建方法
updateView(Object obj)
- 在
onNext()
中,得到想要的片段为SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
- 致电
fragment.updateView(obj);
希望对您有所帮助。
我有一个简单的用例:
Activity1 创建片段1
fragment1 创建后通知 activity 它已创建并更新其 activity1 个视图。
activity1 收到通知后更新 fragment1 观看次数。
我正在使用 rxandroid,子库 rxlifecycle
组件和 android,但我仍处于学习阶段,Whosebug 上什至没有 rx-lifecycle
标签,所以我还在努力理解这个库的流程..
编辑
我不想用 EventBus ,就像大家喊着大家做某事一样,所以 Rxjava Observable 的方法会很有用
需要考虑的两点:
仅仅因为你使用了 EventBus 并不意味着它需要 全球的。如果你愿意,你可以有多个事件总线,你可以 在两个组件(Activity 和 Fragment)之间共享一个。
RxJava 文档中有几个示例显示 如何使用 RxJava
实现事件总线功能
通过使用事件总线,您可以将整个过程与 Android 生命周期分离,从而大大简化事情。
要将信息从片段发布到 activity,您应该使用事件总线通知 activity 片段创建(替换回调和它们创建的混乱)。
使用 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()
或您喜欢的任何地方。
此外,在 activity 中,您需要将以下代码放入您的事件总线:
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
}
}
});
对于第二部分,即从 activity 更新片段,我不建议使用这种方法,因为它会导致不必要的复杂性,而是使用 "original way" 作为:
- 在 Fragment 中创建方法
updateView(Object obj)
- 在
onNext()
中,得到想要的片段为SampleFragment fragment = (SampleFragment)getSupportFragmentManager().findFragmentByTag("TAG");
- 致电
fragment.updateView(obj);
希望对您有所帮助。