0

我有一个跟踪登录用户的单身人士。如果为空,我有一个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()

4

1 回答 1

0

我一定要在某个地方取消订阅吗?

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

如果是在哪里?在 onComplete() 里面?

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

// PS StorIO 的有趣用例!

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

于 2016-01-20T20:33:57.320 回答