2014-05-17 27 views
0

在自定义应用程序子类中创建Rx Observables是否可以接受?做的原因是,我可以在应用程序内部创建BehaviorSubject,并要求每10分钟从服务器进行更改,每个订阅此Observable的Activity或Fragment将只获取最后一次更改状态。在自定义应用程序子类中使用Observable

问题是这个架构在应用程序生命周期处理和易用性方面是否可以被认为是安全的?

class CustomApplication extends Application { 
    ... 

    BehaviorSubject<Friends> mFriends = new BehaviorSubject<Friends>; 
    public void createObservables() { 
     Observable.create(new Observable.OnSubscribe<Friends>() { 
     public void call(Subscriber<?> s) { 
      while(true) { 
       mFriends.onNext("randomFriendN"); 
       sleep(10sec); 
      } 
     } 
     }) 
     .subscribeOn(Schedulers.newThread()) 
     .subscribe(new Observer<List<NewsCategory>>() { 
     public void onNext(Friends f) { //empty } 
     }); 
    } 
    public BehaviorSubject<Friends> getFriends() { 
     return mFriends; 
    } 
} 

UPDATE: 每次当新的活动创建的,想要得到的数据就可以得到它的ApplicationContext的BehaviorSubject然后订阅它,而主题将发出最后发出的值; 为什么我想这样做?例如。假设您有新闻项目,您获取了新闻源,并且您想要开始后台任务以获取新闻项目的全部内容,那么当您滚动新闻列表时,我可以开始获取数据,并且当您单击详细的活动时,我们可以显示它已经被抓取,或者只是下载它。

+1

你能否提供一些伪代码来消除任何歧义? – nhaarman

+0

提供了一种伪代码,感谢您的建议 – user1831986

+0

只是一个改进提示:BehaviorSubject也是一个观察者。您可以直接订阅(BehaviorSubject)。 – zsxwing

回答

2

我认为这是非常安全的,只要在应用程序初始化期间只调用一次createObservables()即可。几个建议的更改...

我不会公开getFriends()返回值中的mFriends的BehaviorSubject部分。这样getFriends()的调用者就不会试图调用onNext()。如果你想成为超级安全使用.asObservable()和来电者甚至无法投的返回值回BehaviorSubject

public Observable<Friends> getFriends() { 
    return mFriends; 
} 

:将其更改为。

public Observable<Friends> getFriends() { 
    return mFriends.asObservable(); 
} 

我还会更新您的createObservable()方法,以从订阅回调调用BehaviorSubject onNext()。这里是你的代码稍作修改以使用NewsItems。然后

BehaviorSubject<List<NewsItem>> mNewsItemSubject = BehaviorSubject.create(); 

void createObservables() { 
    Observable 
      .timer(10, 10, TimeUnit.SECONDS, Schedulers.newThread()) 
      .flatMap(new Func1<Long, Observable<List<NewsItem>>>() { 
       @Override 
       public Observable<List<NewsItem>> call(Long aLong) { 
        // Normally you would create a network API that returns Observable<NewsItem>. 
        // For now just pretend this returned Observable makes an Observable 
        // network request. 
        return Observable.just(
          Arrays.asList(
            new NewsItem("fakeNewsItem"), 
            new NewsItem("fakeNewsItem1") 
          ) 
        ); 
       } 
      }) 
      .subscribe(new Action1<List<NewsItem>>() { 
       @Override 
       public void call(List<NewsItem> newsItems) { 
        mNewsItemSubject.onNext(newsItems); 
       } 
      }); 
} 

public Observable<List<NewsItem>> observeNewsItems() { 
    return mNewsItemSubject; 
} 

您的Android活动可致电((CustomApplication)getApplication())。observeNewsItems(),以获得最新的新闻和任何更新,而活动是可见的。

final Observable<List<NewsItem>> newsItemsObservable = 
    ((CustomApplication) getApplication()).observeNewsItems(); 

newsItemsObservable 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Observer<List<NewsItem>>() { 
      @Override 
      public void onCompleted() { 
       // All done. 
      } 

      @Override 
      public void onError(Throwable e) { 
       // Notify user of error (maybe) 
      } 

      @Override 
      public void onNext(List<NewsItem> newsItems) { 
       // Update the UI with newsItems. 
      } 
     }); 
相关问题