0

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

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

}

在我的活动中使用经理内部和外部的可观察对象是否正确?

它可以有什么问题?

- - 编辑

改为地图:

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

}

这是个好主意吗?

4

1 回答 1

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在对其进行操作时更改类型时使用。

这样,无论何时onNext发生在您的 observable 上(即订阅您的活动),您都可以访问Session那里。

于 2015-07-02T10:01:46.293 回答