1. 程式人生 > >EventBus 和RxLifecycle 一起使用所引發的問題及解決辦法 -java.lang.NoClassDefFoundError: android/os/PersistableBundle

EventBus 和RxLifecycle 一起使用所引發的問題及解決辦法 -java.lang.NoClassDefFoundError: android/os/PersistableBundle

之前一直用RxLifecycle 也沒啥事,但是在引入EventBus之後引發了一個異常:java.lang.NoClassDefFoundError: android/os/PersistableBundle ,這個異常剛開始沒發現,因為開始時使用的時高版本測試的,但是當打包準備釋出時測試,發現在4.4機子上直接崩潰了

02-03 09:02:01.527 4190-4190/com.u91porn E/AndroidRuntime: FATAL EXCEPTION: main
                                                           Process: com.u91porn, PID: 4190
java.lang.NoClassDefFoundError: android/os/PersistableBundle at java.lang.Class.getDeclaredMethods(Native Method) at
java.lang.Class.getPublicMethodsRecursive(Class.java:894) at java.lang.Class.getMethods(Class.java:877) at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:157
) at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88) at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64) at org.greenrobot.eventbus.EventBus.register(EventBus.java:140) at com.u91porn.ui.main.MainActivity.onCreate(MainActivity.java:110) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/com.u91porn-1.apk", zip file "/data/data/com.u91porn/code_cache/secondary-dexes/com.u91porn-1.apk.classes2.zip"],nativeLibraryDirectories=[/data/app-lib/com.u91porn-1, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:497) at java.lang.ClassLoader.loadClass(ClassLoader.java:457) at java.lang.Class.getDeclaredMethods(Native Method) at java.lang.Class.getPublicMethodsRecursive(Class.java:894) at java.lang.Class.getMethods(Class.java:877) at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:157) at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88) at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64) at org.greenrobot.eventbus.EventBus.register(EventBus.java:140) at com.u91porn.ui.main.MainActivity.onCreate(MainActivity.java:110) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)

於是檢視日誌似乎是引入eventbus引發的,於是老套路,copy異常google,可是發現解決問題都是大同小異,重寫oncreate方法問題,但對我貌似沒啥用??在仔仔細細檢查了自己重寫的activiy的oncreate方法無誤後,一臉無助了……

於是細想,既然自己的沒問題,那麼問題應該時出在繼承第三方activiy的,於是逐個排除,在查到RxLifecycle 時,終於時發現了其重寫了onCreate(Bundle savedInstanceState, PersistableBundle persistentState) 有兩個引數的方法,雖然我自己本身並沒有重寫,但是也會丟擲異常,想著也不能去copy下來改了吧,麻煩,且治標不治本,於是想到了不久前google釋出了Lifecycle元件,似乎不用繼承即可感知activiy以及fragment的生命週期,於是google Lifecycle元件相關資料以及在RxLifecycle 中查詢,發現原來RxLifecycle早支援了呀。

於是乎在專案中引入RxLifecycle 再也不用繼承它原來提供的那些基類了,只需

  1. 修改module 的build.gradle檔案,加入
    compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
    // If you want to use Android Lifecycle for providers
    compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1'
  1. 在AppCompatActivity或者fragment中
public class MainActivity extends AppCompatActivity
protected final LifecycleProvider<Lifecycle.Event> provider = AndroidLifecycle.createLifecycleProvider(this);


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //然後呼叫即可
        myObservable.compose(provider.<String>bindUntilEvent(Lifecycle.Event.ON_STOP))
    }
}


就是這麼簡單,收工(當然也許是我自己使用方式不當引起,但是這反倒可以引出使用新方式,也是不錯的了)。