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