保持订阅在单一状态下打开
问题描述:
我有一个记录登录用户的单身人士。如果instance
为空,我有一个getInstance()
方法从数据库中提取用户。我的问题是如果保持打开订阅是可以的,那么对数据库的任何更新都会自动更新instance
变量。保持订阅在单一状态下打开
这里是我的类看起来像:
public class CurrentUser {
private static User instance;
private CurrentUser(){
//Singleton
}
public static void init(){
getCurrentuserFromDatabase();
}
public static User getInstance(){
if(instance == null){
getCurrentuserFromDatabase();
}
return instance;
}
private static void getCurrentuserFromDatabase(){
DatabaseModule.getStorIOSQLite()
.get()
.object(User.class)
.withQuery(
//Select a user from the User table whose session token is not null and is not empty
Query.builder()
.table(UsersTable.TABLE)
.where(UsersTable.COLUMN_SESSION_TOKEN + "IS NOT NULL AND " +
UsersTable.COLUMN_SESSION_TOKEN + " != \"\"")
.build())
.prepare()
.createObservable()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.subscribe(new Observer<User>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
//user wasn't logged in
}
@Override
public void onNext(User user) {
instance = user;
}
});
}
}
如果我肯定在某个地方打电话unsubscribe
?如果是这样的话? onComplete()
?
答
我是否肯定会在某处拨打取消订阅?
不,如果您希望在整个应用程序生命周期中观察此查询的更改,则无需从其取消订阅!
如果是这样的话?在onComplete()?
没有意义正在从RX Subscription
在onComplete()
取消,因为当你收到onComplete()
,Subscription
已经完成,并呼吁unsubscribe()
不会用它做任何事情。
// P.S. StorIO有趣的使用案例!
希望你User
类是不可变的,并且已经正确重写equals()
和hashCode()
因为它看起来像,你就分享到应用程序和更超过users
表的任何更新的所有组件更新参照新的对象,所以它可能影响已经与user
对象一起工作的代码,然后抓取新的对象。
感谢您的回答。如果不在onComplete()中,那么在onNext()中如何。我想我的问题是哪里是最适合退订的地方?另外,在你后半段的回答中,我不完全明白你的意思。为什么我需要让这个类不可变? – Sree
那么,如果你在'onNext()'退订,那么你将不会收到任何更新。 –
哦,等等,你正在异步填充'User instance'并且可能返回'null'作为'getInstance()'的结果,好吧,现在我不确定你希望你的代码如何工作... –