通过 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
。
我有一个管理器封装了对改造服务的调用,因为我需要在登录时保存会话令牌和对象,然后:
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
。