2016-01-20 90 views
0

我有一個記錄登錄用戶的單身人士。如果instance爲空,我有一個getInstance()方法從數據庫中提取用戶。我的問題是如果保持打開訂閱是可以的,那麼對數據庫的任何更新都會自動更新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

我是否肯定會在某處撥打取消訂閱?

不,如果您希望在整個應用程序生命週期中觀察此查詢的更改,則無需從其取消訂閱!

如果是這樣的話?在onComplete()?

沒有意義正在從RX SubscriptiononComplete()取消,因爲當你收到onComplete()Subscription已經完成,並呼籲unsubscribe()不會用它做任何事情。

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

希望你User類是不可變的,並且已經正確重寫equals()hashCode()因爲它看起來像,你就分享到應用程序和更超過users表的任何更新的所有組件更新參照新的對象,所以它可能影響已經與user對象一起工作的代碼,然後抓取新的對象。

+0

感謝您的回答。如果不在onComplete()中,那麼在onNext()中如何。我想我的問題是哪裏是最適合退訂的地方?另外,在你後半段的回答中,我不完全明白你的意思。爲什麼我需要讓這個類不可變? – Sree

+0

那麼,如果你在'onNext()'退訂,那麼你將不會收到任何更新。 –

+0

哦,等等,你正在異步填充'User instance'並且可能返回'null'作爲'getInstance()'的結果,好吧,現在我不確定你希望你的代碼如何工作... –

相關問題