我想在android中使用RXJava在后台线程上执行长计算.计算后,我试图在RecylervIEw中呈现结果.我正在使用以下代码:
Observable.just("true") .subscribeOn(Schedulers.io()) .map(new Func1<String, String>() { @OverrIDe public String call(String s) { FeedList.clear(); if (eventFeedItems != null && !eventFeedItems.isEmpty()) { for (int i = 0; i < eventFeedItems.size(); i++) { if (eventFeedItems != null && eventFeedItems.get(i) != null && ((eventFeedItems.get(i).getType() != null && eventFeedItems.get(i).getType().equalsIgnoreCase("EVENT")) || (eventFeedItems.get(i).getActivityRequestType() != null && eventFeedItems.get(i).getActivityRequestType().equalsIgnoreCase(EventConstants.TRENDING_ACTIVITY)))) { if (eventFeedItems.get(i).getActivityRequestType() != null && !eventFeedItems.get(i).getActivityRequestType().equalsIgnoreCase("")) { FeedList.add(new FeedsListModel(eventFeedItems.get(i), eventFeedItems.get(i).getActivityRequestType(), null)); } else if (eventFeedItems.get(i).getRequestType() != null && !eventFeedItems.get(i).getRequestType().equalsIgnoreCase("")) { FeedList.add(new FeedsListModel(eventFeedItems.get(i), eventFeedItems.get(i).getRequestType(), null)); } else FeedList.add(new FeedsListModel(eventFeedItems.get(i), EventConstants.ATTENDEE_POST, null)); } } } Log.d("calculations","Completed"); return ""; } }) .observeOn(AndroIDSchedulers.mainThread()) .subscribe(new Action1<String>() { @OverrIDe public voID call(String s) {// Feed_List.setLayoutManager(mLayoutManager);// Feedlistadapter.notifyDataSetChanged(); Log.d("Adapter", "Set"); } }, new Action1<Throwable>() { @OverrIDe public voID call(Throwable throwable) { Log.d("Exception", "oh! fish..."); throwable.printstacktrace(); } });
上面的代码使我面临UI障碍,因为ArrayList eventFeedItems的大小大约超过300个项目.我是RXJava的新手.请帮帮我.
解决方法:
您将无法使用map-Operator实现并发.
第一个subscriptionOn会将所有发射移至IO调度器.这里没有并发发生.
.subscribeOn(Schedulers.io())
映射 *** 作符将从上一个线程同步调用.在您的情况下,它将是IO线程池中的某个线程.
.map(new Func1<String, String>() {
执行完map-Operator后,您可以使用以下命令将值从IO线程移至AndroID-UI-event-loop
.observeOn(AndroIDSchedulers.mainThread())
将值从IO线程转换为UI线程后,将处理初始可观察值中的下一个值.
Observable.just("true")
在您的示例中,将不再有任何值,因为您只产生一个值.
为了实现并发,您应该使用flatMap而不是map.并在flatMap中使用subscriptionOn()在另一个线程上创建每个流.
请考虑以下示例,以了解并发情况.每个可观察对象将被立即订阅,因此最大值训练的时间大约是5秒.如果现在会发生并发,则将需要1 2 3 4 5秒加上执行时间.
@Testpublic voID name1() throws Exception { Observable<Integer> value = Observable.just(1_000, 2_000, 3_000, 4_000, 5_000) .flatMap(i -> Observable.fromCallable(() -> doWork(i)).subscribeOn(Schedulers.io()) ).doOnNext(integer -> System.out.println("value")); value.test().awaitTerminalEvent();}private int doWork(int sleepMilli) { try { Thread.sleep(sleepMilli); } catch (InterruptedException e) { e.printstacktrace(); } return -1;}
如果您想进一步了解flatMap的并发发生方式,请考虑阅读http://tomstechnicalblog.blogspot.de/2015/11/rxjava-achieving-parallelization.html
关于您的代码,我建议:
>将接口的匿名实现转换为私有内部类实现,并使用其实例.您将获得更具可读性的可观察性
>不要对内部运算符的全局变量使用副作用.您
如果涉及并发,将获得竞争条件.
List<FeedsListModel> eventFeedItems = Arrays.asList(new FeedsListModel(), new FeedsListModel());Observable<FeedsListModel> FeedsListModelObservable = Observable.fromIterable(eventFeedItems) .flatMap(FeedsListModel -> Observable.fromCallable(() -> calculation(FeedsListModel)) .subscribeOn(Schedulers.computation()));FeedsListModelObservable .toList() .observeOn(Schedulers.io()) .subscribe(FeedsListModels -> { // do UI stuff});
帮助方法:
private FeedsListModel calculation(FeedsListModel model) { // do calculation here return new FeedsListModel();}
总结 以上是内存溢出为你收集整理的如何在RXJava Android中对后台线程执行长计算全部内容,希望文章能够帮你解决如何在RXJava Android中对后台线程执行长计算所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)