一个 Activity
包含一个 Fragment
,它又包含一个子 Fragment
,它请求一个 Service
。该应用程序尝试实现 dobjanschi休息架构。
当 Service
完成工作时,它必须传播操作结果。我尝试使用 PendingIntent
但它似乎只被 Activity 捕获,而我需要子 fragment 才能得到通知。你能提出什么建议吗? Binder ?绿色机器人事件总线? RxJava(我已经在项目中了)?
谢谢。
最佳答案
RxJava
一个简单的方法是使用 Singleton 来包装同步的“PublishSubject”
* Singleton
*
* to send an event use EventBusRx.getInstance().topic1.onNext("completed");
*/
public class EventBusRx {
private static EventBusRx ourInstance = new EventBusRx();
public static EventBusRx getInstance() {
return ourInstance;
}
private EventBusRx() {}
/**
* Use of multiple topics can be usefull
* SerializedSubject avoid concurrency issues
*/
public final Subject<String, String> topic1 = new SerializedSubject<>(PublishSubject.create());
public final Subject<Integer, Integer> topic2 = new SerializedSubject<>(PublishSubject.create());
}
并且您可以从服务发送事件
EventBusRx.getInstance().topic1.onNext("completed");
并在 fragment 中或任何时候响应事件
public class MyFragment extends Fragment {
// [...]
Subscription subscription_topic1;
@Override
public void onResume() {
super.onResume();
subscription_topic1 = EventBusRx.getInstance().topic2
.subscribeOn(AndroidSchedulers.mainThread()) // or on other sheduler
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
// update ui
}
});
}
@Override
public void onPause() {
// important to avoid memory leaks
subscription_topic1.unsubscribe();
super.onPause();
}
}
不要忘记取消订阅
这个想法类似于 Roger'one 使用单例但强制执行 ThreadSafety 包装 PublishSubject。
不需要 Observable.switchOnNext(subject)
EventBus 库
greenRobot Eventbus 和 Otto 都不错并且具有相同的功能,但缺点是它们使连接更加困惑(特别是 EventBus)。如果您已经在使用 rx,我认为最好继续使用它
这是一篇关于该主题的鼓舞人心的文章 Implementing an Event Bus With RxJava
本地广播
执行此操作的经典方法是使用 LocalBroadcastManager但在我看来,它们是一种痛苦
关于android - 服务- fragment 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140026/