Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在自定义应用程序子类中使用Observable_Android_Reactive Programming_Rx Java - Fatal编程技术网

Android 在自定义应用程序子类中使用Observable

Android 在自定义应用程序子类中使用Observable,android,reactive-programming,rx-java,Android,Reactive Programming,Rx Java,在自定义应用程序子类中创建Rx观测值是否可以接受。这样做的原因是,我可以在应用程序内创建BehaviorSubject,并将每隔10分钟从服务器请求更改,订阅此可观察对象的每个活动或片段将只获得更改的最后状态 问题是,就应用程序生命周期处理和易用性而言,这种体系结构是否可以被认为是安全的 class CustomApplication extends Application { ... BehaviorSubject<Friends> mFriends = new Be

在自定义应用程序子类中创建Rx观测值是否可以接受。这样做的原因是,我可以在应用程序内创建BehaviorSubject,并将每隔10分钟从服务器请求更改,订阅此可观察对象的每个活动或片段将只获得更改的最后状态

问题是,就应用程序生命周期处理和易用性而言,这种体系结构是否可以被认为是安全的

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;
   }
}
类CustomApplication扩展应用程序{
...
行为主体mFriends=新的行为主体;
公共可观察对象(){
创建(新的Observable.OnSubscribe(){
公用无效呼叫(用户){
while(true){
mFriends.onNext(“randomfriends”);
睡眠(10秒);
}
}
})
.subscribeOn(Schedulers.newThread())
.订阅(新观察员){
public void onNext(Friends){//empty}
});
}
公共行为主体getFriends(){
回报朋友;
}
}
更新: 每次创建新活动并希望获取数据时,它都可以获取它ApplicationContext的BehaviorSubject,然后订阅它,Subject将发出最后发出的值;
我为什么要这样做?例如,假设您有新闻项,您获取了新闻提要,并且您希望启动后台任务来获取新闻项的全部内容,在这种情况下,我可以在您滚动新闻列表时开始获取数据,当您单击“详细活动”时,我们可以从已获取的内容中显示数据,或者直接下载。

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

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

publicobservable getFriends(){
回报朋友;
}
如果您希望超级安全,请使用.asObservable(),调用者甚至无法将返回值强制转换回BehaviorSubject

publicobservable getFriends(){
返回mFriends.asObservable();
}
我还将更新createObservable()方法,从subscribe回调调用BehaviorSubject onNext()。这是您的代码,经过了一些修改,可以使用新闻项

BehaviorSubject mNewsItemSubject=BehaviorSubject.create();
void createObservables(){
可观察
.timer(10,10,TimeUnit.SECONDS,Schedulers.newThread())
.flatMap(新函数1(){
@凌驾
公众可观察呼叫(长期){
//通常情况下,您会创建一个返回可观察的网络API。
//现在,只要假设这个返回的可观察对象是一个可观察对象
//网络请求。
返回可观察的(
Arrays.asList(
新新闻项目(“fakeNewsItem”),
新新闻项目(“fakeNewsItem1”)
)
);
}
})
.订阅(新操作1(){
@凌驾
公共作废调用(列出新闻项){
mNewsItemSubject.onNext(新闻项目);
}
});
}
公众可观察到的观测项目(){
返回主题;
}
然后,您的Android活动可以调用((CustomApplication)getApplication()).observeNewsItems()来获取活动可见时的最新新闻和任何更新

最终可观察的NewsItemsBServable=
((CustomApplication)getApplication()).ObserveNewItems();
新闻条目可服务
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
//都做完了。
}
@凌驾
公共无效申报人(可丢弃的e){
//通知用户错误(可能)
}
@凌驾
public void onNext(列出新闻项){
//使用新闻项更新UI。
}
});

您是否可以提供一些伪代码来消除任何歧义?提供了一种伪代码,感谢您的建议只是一个改进提示:BehaviorSubject也是一个观察者。你可以直接订阅(行为主题)。对我来说这不安全。即使您取消订阅了主题的所有内容,发送到主题的可观察消息也永远不会被垃圾收集。如果您调用createObservables两次,两个observables将永远存在(特别是因为这是在应用程序中)。