简体   繁体   English

由于rxJava函数中的foreach导致android设备崩溃

[英]Crash android device by reason of foreach in rxJava functions

I use rxJava in my application. 我在应用程序中使用rxJava。 And often i used such code: 而且我经常使用这样的代码:

couponListInteractor.getObservableData(storeId)
        .subscribe(data -> 
                data.forEach(item ->
                {
                    if (!couponsCode.contains(item.getCode()))
                    {
                        couponsCode.add(item.getCode());
                    }
                }
        );

When i was developing application in my emulator everething was ok. 当我在模拟器中开发应用程序时,一切正常。 But when i was starting test my application in devices (4.0 android version). 但是,当我开始测试设备中的应用程序(4.0安卓版)时。 I was getting some erors. 我有点不对劲。

FATAL EXCEPTION: RxNewThreadScheduler-1
                                                                        Process: com.mrrebates.cashback, PID: 20428
                                                                        java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
                                                                            at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:59)
                                                                            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
                                                                            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
                                                                            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                            at java.lang.Thread.run(Thread.java:818)
                                                                         Caused by: java.lang.NoClassDefFoundError: com.couponautoapplier.cashback.model.api.apistorage.DataConfigApiStorage$1$$Lambda$1
                                                                            at com.couponautoapplier.cashback.model.api.apistorage.DataConfigApiStorage$1.call(DataConfigApiStorage.java:50)
                                                                            at com.couponautoapplier.cashback.model.api.apistorage.DataConfigApiStorage$1.call(DataConfigApiStorage.java:28)
                                                                            at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:69)
                                                                            at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:41)
                                                                            at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:38)
                                                                            at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:173)
                                                                            at rx.Subscriber.setProducer(Subscriber.java:211)
                                                                            at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
                                                                            at rx.Subscriber.setProducer(Subscriber.java:205)
                                                                            at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
                                                                            at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
                                                                            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
                                                                            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
                                                                            at rx.Observable.unsafeSubscribe(Observable.java:10200)
                                                                            at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
                                                                            at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
                                                                            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
                                                                            at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
                                                                            at rx.Observable.unsafeSubscribe(Observable.java:10200)
                                                                            at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)

I easy corrected this error: 我很容易纠正此错误:

couponListInteractor.getObservableData(storeId)
        .subscribe(data -> {
                for(CouponListItemViewModel item: data)
                {
                    if(!couponsCode.contains(item.getCode()))
                    {
                        couponsCode.add(item.getCode());
                    }
                }
          });

Do I have to correct everywhere foreach to for? 我是否需要在所有地方纠正foreach?

I don't want to do this because it's looks beautiful: 我不想这样做,因为它看起来很漂亮:

 couponsCode.forEach(value -> couponsCodes.add(new CouponsCode(value)));

The issue is that you're using Stream API of Java 8 at API level below 24. 问题是您正在使用低于24的API级别的Java 8 Stream API。

Currently it's supported from API level 24 only. 目前仅API 24级支持。

Java 8 features support mechanism has been changed recently when Google ditch the new toolchain of Jack and Jill, And lately announced of supporting Java 8 features using old Toolchain with something calls 'desugar' which will transform the Java8 class files to Java 7 compatible class files (available from Android Studio 2.4 Preview 6). 当Google放弃Jack和Jill的新工具链时,Java 8功能支持机制最近发生了变化,并且最近宣布将使用带有“ desugar”字样的旧工具链支持Java 8功能,这会将Java8类文件转换为Java 7兼容类文件。 (可从Android Studio 2.4预览版6获得)。
You can read more here . 您可以在这里阅读更多内容。

Thanks yosriz . 谢谢yosriz I use: https://github.com/aNNiMON/Lightweight-Stream-API . 我使用: https : //github.com/aNNiMON/Lightweight-Stream-API My code was looking like that: 我的代码看起来像这样:

 couponsCode.forEach(value -> couponsCodes.add(new CouponsCode(value)));

And my code looking like that now: 我的代码现在看起来像这样:

 Stream.of(couponsCode).forEach(value -> couponsCodes.add(new CouponsCode(value)));

All errors are gone. 所有错误都消失了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM