如何实现BehaviorSubject + retrofit api调用

时间:2017-12-12 17:55:29

标签: java android retrofit2 rx-java2

我是RxJava的新手。

我正在使用api调用api.java进行改造:

@GET("someurl")
Observable<Profile> getProfile(); 

我想用一个方法实现一些服务,返回Observable<Profile>和:

1)如果某人首先订阅了observable,那么在开始时调用API请求,结果(profile)将在订阅者处可用。

2)如果其他人订阅了observable,则订户在没有API调用的情况下获得已缓存的数据(来自第一个订阅者)。第3,第4位订阅者也一样......

3)一些新用户希望通过API调用获得“最后”数据。在这种情况下,将被称为API请求,所有订阅者都会获得最后的数据。

我的解决方案MyService.java:

private final BehaviorSubject<Profile> profile = BehaviorSubject.create();

public BehaviorSubject<Profile> subscribe(boolean useCache) {
        if (!useCache || !profile.hasValue()) {
            api.getProfile().subscribe(new Consumer<Profile>() {

                @Override
                public void accept(UserProfile result) throws Exception {
                    profile.onNext(result);
                }
            });
        }

        return profile;
    }

但这个解决方案看起来非常笨拙。此外,API调用后没有取消订阅。

1 个答案:

答案 0 :(得分:0)

让您的主题订阅您的实际API observable,然后其他订阅订阅主题。

Api api = getRetrofitApiInterfaceIpml();
BehaviorSubject<Profile> subject = BehaviorSubject.create();
Observable<Profile> profileObservable = api.getProfile();
profileObservable.subscribe(subject);

然后将主题公开为可观察的主题。