2016-01-20 81 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()'的结果,好吧,现在我不确定你希望你的代码如何工作... –

相关问题