我有一个跟踪登录用户的单身人士。我有一个getInstance()
方法,如果instance
为空,则从数据库中提取用户。我的问题是,如果可以保持订阅打开,那么对数据库的任何更新都将自动更新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()
内?
答案 0 :(得分:0)
我应该在某个地方打电话取消订阅吗?
不,如果您想在申请流程的整个生命周期内观察此查询的更改,则无需取消订阅!
如果是这样的话?在onComplete()中?
在Subscription
中取消订阅Rx onComplete()
是没有意义的,因为当您收到onComplete()
时,Subscription
已经完成,并且unsubscribe()
的来电不会用它做任何事情。
// P.S. 有趣的StorIO用例!
希望您的User
课程是不可变的,并且已正确覆盖equals()
和hashCode()
,因为您似乎正在将其分享给应用的所有组件,而不是通过任何更新users
表更新对新对象的引用,因此它可能会影响已经与user
对象一起使用的代码,然后再抓取新对象。