通过 Retrofit 多次使用相同的 Observable

Multiple use of same Observable with Retrofit

我有一个管理器封装了对改造服务的调用,因为我需要在登录时保存会话令牌和对象,然后:

class LoginManager {

     public static Observable<Session> login(String email, String password) {
        Credential credential = new Credential(email, password);
        Observable<Session> observable = SERVICE.createSession(credential);

        observable.subscribe(new Subscriber<Session>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(Session session) {
                String token = session.getToken();
                saveToken(token);
                save(session.buildCustomer());
            }
        });

        return observable;
    } 
}

我的服务看起来像:

public interface CustomerService {

    @POST("/api/sessions/customer")
    Observable<Session> createSession(@Body Credential credential);

}

在我的 activity 中使用管理器内部和外部的 observable 是否正确?

它会有什么问题?

---- 编辑

更改为地图:

class LoginManager {

     public static Observable<Session> login(String email, String password) {
        Credential credential = new Credential(email, password);
        return SERVICE.createSession(credential)
        .map(session - {
            String token = session.getToken();
            saveToken(token);
            save(session.buildCustomer());
            return session;
        });
    } 

}

这是个好主意吗?

只要有人订阅,observable 就会开始发射。

我建议你在你的经理中做的是 return observable 并向其中添加 .doOnNext()

return observable.doOnNext(new Action1<Session>() {
    @Override
    public void call(final Session session) {
        String token = session.getToken();
        saveToken(token);
        save(session.buildCustomer());
    }   
});

.map 用于在操作时更改 observable 类型。

这样,只要 onNext 发生在您的可观察对象上(即从您的 activity 订阅),您就可以访问那里的 Session