zion223 / NeteaseCloudMusic-MVVM

Jetpack MVVM最佳实践 - 重构仿网易云音乐安卓客户端
313 stars 67 forks source link

闪屏页确认完权限后闪退,之后也无法打开 #19

Closed dyjcow closed 1 year ago

dyjcow commented 2 years ago

E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1 Process: com.netease.music, PID: 20314 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: Lokhttp3/internal/Platform; at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:69) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919) Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/internal/Platform; at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:112) at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:160) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229) at okhttp3.RealCall.execute(RealCall.java:81) at retrofit2.OkHttpCall.execute(OkHttpCall.java:204) at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45) at io.reactivex.Observable.subscribe(Observable.java:12267) at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34) at io.reactivex.Observable.subscribe(Observable.java:12267) at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35) at io.reactivex.Single.subscribe(Single.java:3603) at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89) at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578) at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66) at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:919)  Caused by: java.lang.ClassNotFoundException: Didn't find class "okhttp3.internal.Platform" on path: DexPathList[[zip file "/data/app/com.netease.music-lvX9TGsMkL8OEKkIIJDp4w==/base.apk"],nativeLibraryDirectories=[/data/app/com.netease.music-lvX9TGsMkL8OEKkIIJDp4w==/lib/x86, /system/lib, /system/product/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:112)  at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:160)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)  at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229)  at okhttp3.RealCall.execute(RealCall.java:81)  at retrofit2.OkHttpCall.execute(OkHttpCall.java:204)  at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)  at io.reactivex.Observable.subscribe(Observable.java:12267)  at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)  at io.reactivex.Observable.subscribe(Observable.java:12267)  at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)  at io.reactivex.Single.subscribe(Single.java:3603)  at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)  at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)  at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)  at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)  at java.util.concurrent.FutureTask.run(FutureTask.java:266)  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:919) 

dyjcow commented 2 years ago

分享一下我解决这个bug的历程

  1. 我先是在启动页设置断点,追踪到是在使用Rxjava中出现了bug后,我就去百度上面的日志

E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-1 Process: com.netease.music, PID: 20314 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: Lokhttp3/internal/Platform; 百度这个没有找到对应的异常

  1. 然后百度下方日志的找到了说明,说是Rxjava在取消订阅后依旧会抛出了异常,但是由于已经取消了,它没法处理异常了,所以导致了程序崩溃,然后很多人都给出的解决方法是在application中写入这个方法RxJavaPlugins.setErrorHandler()来全局处理异常

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

  1. 我使用RxJavaPlugins.setErrorHandler()这个方法后,打印抛出的异常,是下面这个。这个异常是由于okhttp的版本和okhttp日志版本不一致导致的,升级okhttp到3.5.0后就解决了

java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/internal/Platform

zion223 commented 2 years ago

可以提个pr,我合并到主版本

dyjcow commented 2 years ago

解决上边的bug后,在输入账号和密码后又闪退,闪退的日志是这样子: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.netease.music, PID: 14703 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.netease.music/com.netease.music.MainActivity}: android.view.InflateException: Binary XML file line #36 in com.netease.music:layout/activity_main: Binary XML file line #36 in com.netease.music:layout/activity_main: Error inflating class fragment at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: android.view.InflateException: Binary XML file line #36 in com.netease.music:layout/activity_main: Binary XML file line #36 in com.netease.music:layout/activity_main: Error inflating class fragment Caused by: android.view.InflateException: Binary XML file line #36 in com.netease.music:layout/activity_main: Error inflating class fragment Caused by: java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView() at androidx.fragment.app.Fragment.getViewLifecycleOwner(Fragment.java:361) at com.netease.music.ui.page.drawer.DrawerFragment.onCreate(DrawerFragment.java:53) at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949) at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138) at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988) at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:281) at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140) at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135) at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319) at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298) at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1069) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:997) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) at android.view.LayoutInflater.inflate(LayoutInflater.java:682) at android.view.LayoutInflater.inflate(LayoutInflater.java:534) at android.view.LayoutInflater.inflate(LayoutInflater.java:481) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:699) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195) at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:303) at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:284) at com.kunminx.architecture.ui.page.DataBindingActivity.onCreate(DataBindingActivity.java:94) at com.kunminx.architecture.ui.page.BaseActivity.onCreate(BaseActivity.java:55) at com.netease.music.MainActivity.onCreate(MainActivity.java:51) at android.app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

dyjcow commented 2 years ago

可以提个pr,我合并到主版本

还没能解决的,之前以为能正常显示出登录页就可以了😂

mandorehaha commented 2 years ago

您好,请问现在有解决方案了吗,我也遇到了同样的问题

yangzhanlong commented 2 years ago

估计是没法解决的,服务器已经关了,没用这个项目

zion223 commented 2 years ago

估计是没法解决的,服务器已经关了,没用这个项目

可以本地自己搭一个服务器就能跑

coolcc2xy commented 2 years ago

可以出个教程怎么能在ubuntu上跑起来吗