[英]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.