java - 由于 rxJava 函数中的 foreach 导致 Android 设备崩溃

标签 java android java-8 rx-java

我在我的应用程序中使用 rxJava。我经常使用这样的代码:

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

当我在模拟器中开发应用程序时,一切都很好。但是当我开始在设备(4.0 android 版本)中测试我的应用程序时。我遇到了一些错误。

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)

我很容易纠正了这个错误:

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

我必须将每个地方的 foreach 更正为 for 吗?

我不想这样做,因为它看起来很漂亮:

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

最佳答案

问题在于您正在使用低于 24 的 API 级别的 Java 8 的 Stream API。

目前仅支持 API 级别 24。

最近,当 Google 放弃 Jack 和 Jill 的新工具链时,Java 8 功能支持机制发生了变化,并且 lately announced使用旧工具链和名为“desugar”的东西支持 Java 8 功能,它将把 Java8 类文件转换为 Java 7 兼容类文件(可从 Android Studio 2.4 Preview 6 获取)。
您可以阅读更多here .

关于java - 由于 rxJava 函数中的 foreach 导致 Android 设备崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43510109/

相关文章:

android - Java 中的内存泄漏,但 Kotlin(相同代码库)中没有……为什么?

java - android fragment 接口(interface)nullpointerexception

java - 我的 spring boot 应用程序的新版本无法连接到 mysql

java - 无法从 Google Cloud Storage 返回对象名称

android - 在 android 的谷歌地图中查找两个位置之间的距离的方法哪种更准确? distanceTo 还是距离?

Android:为什么必须使用 getBaseContext() 而不是这个

java - 接受 Collection<T> 和 <T> 两种类型的通用类型接口(interface)

java - 使用 java8 功能计算列表中的元素数量

java - 为什么在 Java 中有一个同步集合是有用的

java - Lambda 表达式和高阶函数