如何在RXJava Android中对后台线程执行长计算

如何在RXJava Android中对后台线程执行长计算,第1张

概述我想在android中使用RXJava在后台线程执行长计算.计算后,我试图在Recylerview中呈现结果.我正在使用以下代码:Observable.just("true").subscribeOn(Schedulers.io()).map(newFunc1<String,String>(){@Override

我想在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中对后台线程执行长计算所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1091123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存