Сохранение подписки открытой в одной папке

У меня есть синглтон, который отслеживает вошедшего в систему пользователя. у меня есть 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 ответ

Должен ли я определенно звонить отписаться где-нибудь?

Нет, если вы хотите наблюдать за изменениями в этом запросе в течение всего жизненного цикла вашего приложения, вам не нужно отписываться от него!

Если так, то где? Внутри onComplete()?

Нет смысла отписываться от Rx Subscription в onComplete() потому что когда вы получаете onComplete(), Subscription уже закончил и звонит unsubscribe() не буду ничего с этим делать.

// PS Интересный вариант использования для StorIO!

Надеюсь, что ваш User класс неизменен и корректно переопределен equals() а также hashCode() потому что похоже, что вы делитесь ею со всеми компонентами приложения и более чем при любом обновлении users Таблица обновляет ссылку на новый объект, так что это может повлиять на код, который уже работает с user объект, а затем захватывает новый.

Другие вопросы по тегам