io.reactivex.exceptions.UndeliverableException:造成原因:ZonedDateTime; -如何在18 API版本上使用ZonedDateTime?

时间:2019-03-26 22:14:44

标签: java android

所以我是一名业余Android开发人员,遇到了问题。 我们的应用程序使用ZonedDateTime,但是运行低于oero的Android版本的用户正面临崩溃,这可能是由于ZonedDateTime所致,至少日志是这么说的,请有人帮我解决这个问题吗?

这是错误:

io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/ZonedDateTime;
at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:126)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6816)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/ZonedDateTime;
at com.myapp.myapp.cryptoanalysis.fragment.adapter.RVCardAdapter$1.onNext(RVCardAdapter.java:169)
at com.myapp.myapp.cryptoanalysis.fragment.adapter.RVCardAdapter$1.onNext(RVCardAdapter.java:154)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
... 7 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.time.ZonedDateTime" on path: DexPathList[[zip file "/data/app/com.myapp.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.myapp-1/lib/arm, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 12 more

以下是需要支持较低API版本的Java代码:

  @RequiresApi(api = Build.VERSION_CODES.O)
                    @Override
                    public void onNext(HistoData histoData) {

                        TimeSeries series = new BaseTimeSeries("Strategy");

                        //TODO make usable on API 21+
                        ZonedDateTime endTime = ZonedDateTime.now().minusDays(historyDays);

                        //loop for each day of results in histodata
                        for (int i = 0; i < histoData.getData().size(); i++) {

                            //create a new base bar
                            Bar bar = new BaseBar(
                                    endTime.plusDays(i),
                                    histoData.getData().get(i).getOpen(),
                                    histoData.getData().get(i).getHigh(),
                                    histoData.getData().get(i).getLow(),
                                    histoData.getData().get(i).getClose(),
                                    histoData.getData().get(i).getVolumeTo()
                            );

                            series.addBar(bar);

                        }


                        //RUN ANALYSIS
                        Signal signal = TechnicalAnalysis.getSignal(series);

                        //INFLATE LAYOUT STUFF
                        cryptoViewHolder.mSignal.setText(signal.getSignalResult());
                        cryptoViewHolder.mRsiValue.setText(String.valueOf((int) signal.getRsiStrength()));
                        cryptoViewHolder.mMomentumValue.setText(String.valueOf((int) signal.getMomentumStrength()));
                        cryptoViewHolder.mEmaValue.setText(String.valueOf((int) signal.getEmaStrength()));
                        //cryptoViewHolder.mSignalStrength.setText("(" + String.valueOf(signal.getSignalStrength()) + ")");


                    }

在网上搜索时,我发现有人建议使用此库(https://github.com/JakeWharton/ThreeTenABP),但是自述文件不是菜鸟友好的,所以我不知道如何使用它或将公共空白重写为onNext(HistoData histoData )方法使用此库。

请问有人可以帮忙吗?

编辑:此代码是由我们公司的前程序员编写的,我的项目经理希望我对其进行修复。

1 个答案:

答案 0 :(得分:0)

onNext本身的问题,您需要最小化注释的范围,即:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ZonedDateTime endTime = ZonedDateTime.now().minusDays(historyDays);
        } else {
            TODO("VERSION.SDK_INT < O")
        }

对于低于 O 的设备,您将需要另一个 API