0

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

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

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;
   }
}

更新: 每次创建新活动并想要获取数据时,它都可以获取 ApplicationContext 的 BehaviorSubject 然后订阅它,Subject 将发出最后一个发出的值;为什么我要这样做?例如,假设您有新闻项目,您获取了新闻提要,并且您想要启动获取新闻项目完整内容的后台任务,在这种情况下,我可以在您滚动新闻列表时开始获取数据,当您单击详细活动时,我们可以从已经获取的显示它,或者只是下载它。

4

1 回答 1

2

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

我不会在 getFriends() 的返回值中公开 mFriends 的 BehaviorSubject 部分。这样getFriends() 的调用者就不会想调用onNext()。将其更改为:

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

如果您想超级安全,请使用 .asObservable(),调用者甚至无法将返回值转换回 BehaviorSubject。

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.
            }
        });
于 2014-08-28T03:49:55.960 回答