如何在RXJava Android中对后台线程执行长计算
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在RXJava Android中对后台线程执行长计算,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3818字,纯文字阅读大概需要6分钟。
内容图文
![如何在RXJava Android中对后台线程执行长计算](/upload/InfoBanner/zyjiaocheng/684/c7e3bac7549644349c4e7af5f7ccc108.jpg)
我想在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秒加上执行时间.
@Test
public 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中对后台线程执行长计算所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。