保持订阅单一开放

时间:2016-01-20 19:24:30

标签: rx-java storio

我有一个跟踪登录用户的单身人士。我有一个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()内?

1 个答案:

答案 0 :(得分:0)

  

我应该在某个地方打电话取消订阅吗?

不,如果您想在申请流程的整个生命周期内观察此查询的更改,则无需取消订阅!

  

如果是这样的话?在onComplete()中?

Subscription中取消订阅Rx onComplete()是没有意义的,因为当您收到onComplete()时,Subscription已经完成,并且unsubscribe()的来电不会用它做任何事情。

// P.S. 有趣的StorIO用例!

希望您的User课程是不可变的,并且已正确覆盖equals()hashCode(),因为您似乎正在将其分享给应用的所有组件,而不是通过任何更新users表更新对新对象的引用,因此它可能会影响已经与user对象一起使用的代码,然后再抓取新对象。