多次使用相同的Observable和Retrofit

时间:2015-06-30 18:03:25

标签: api retrofit rx-java rx-android

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

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);

}

在我的活动中使用经理内部和外部的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;
        });
    } 

}

这是一个好主意?

1 个答案:

答案 0 :(得分:2)

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

我建议您在经理中做的是返回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

这样,只要你的observable发生onNext(即从你的活动订阅),你就可以访问那里的Session