当前位置: 首页 > 知识库问答 >
问题:

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

和谦
2023-03-14

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

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,然后订阅它,Subject将发出最后发出的值;我为什么要这样做?例如。假设你有新闻项目,你获取了新闻提要,你想启动后台任务来获取新闻项目的全部内容,在这种情况下,我可以在你滚动新闻列表时开始获取数据,当你单击详细活动时,我们可以从已经获取的数据中显示它,或者只是下载它。

共有1个答案

罗凯
2023-03-14

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

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

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

如果您想要超级安全,那么使用。asObservable(),调用者甚至不能将返回值强制转换回BehaviorSubject。

public Observable<Friends> getFriends() {
    return mFriends.asObservable();
}
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;
}
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.
            }
        });
 类似资料:
  • 我试图将自定义对象值传递给Jasper报表,我使用编译后的Jasper即文件。 在jrxml中传递参数 如何访问学生对象?

  • 编辑: 我的理解可能是错误的,但这是一个不同于以编程方式设置语言环境的问题,因为我已经实现了那里建议的答案,我仍然有一些问题。 在这个问题中,我请求帮助解决这些问题(在设置的语言环境中没有参考的问题)。 原始帖子 我试图在我的应用程序中实现自定义语言环境,并遇到几个问题。 在调用setContentView之前,我在所有活动中使用以下代码: 编辑: 我还测试了它与: 我添加到Android中的所有

  • 我正在尝试在我的一个应用程序中使用zxing条形码来扫描条形码。我用intent启动按钮cick上的条形码扫描仪。 我发现,大多数条形码都可以很好地扫描,但当我尝试在我的应用程序中扫描ITF(5个中的2个)条形码时,它不起作用,但如果我只使用zxing条形码扫描仪,它就可以很好地工作。 现在我已经搜索了一段时间,读到我可以使用ALLOWED_LENGTH。我找不到太多关于如何将这些信息传递给扫描仪

  • 问题内容: 主要问题-可能吗?我没有运气就尝试了.. 主app.js 提供者本身 而且我有这样的错误: 有任何想法吗? 谢谢! 问题答案: 您 不能 将服务注入提供者配置部分。 您 CAN 注入服务成初始化提供者的服务的部分。 细节: Angular框架有两个阶段的初始化过程: 阶段1:配置 在此阶段,将初始化所有提供程序,并执行所有部分。这些部分可能包含配置提供程序对象的代码,因此可以将它们与提