我有一个管理器,它封装了对改装服务的调用,因为我需要在登录时保存会话令牌和对象,然后:
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;
});
}
}
这是一个好主意?
答案 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
。