gpt4 book ai didi

android - 服务- fragment 通信

转载 作者:太空狗 更新时间:2023-10-29 16:16:18 26 4
gpt4 key购买 nike

一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com