ClassNotFoundException:没有找到类“android.os.PersistableBundle”Otto Android 5.0

问题描述 投票:20回答:4

我有一个奇怪的问题。我有一个应用程序,我部署在Android 4.4设备上并使用Otto库。我在Android 5.0设备上部署了该应用程序。它仍然有效。我重新尝试了4.4,该应用程序将无法启动。

显然,它试图使用API​​ 21类的PersistableBundle.class。在这里我的日志:

    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.os.PersistableBundle" on path: DexPathList[[zip file "/data/app/fr.myapp.apk"],nativeLibraryDirectories=[/data/app-lib/fr.myapp, /vendor/lib, /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.getDeclaredMethods(Class.java:656)
            at com.squareup.otto.AnnotatedHandlerFinder.loadAnnotatedMethods(AnnotatedHandlerFinder.java:52)
            at com.squareup.otto.AnnotatedHandlerFinder.findAllProducers(AnnotatedHandlerFinder.java:126)
            at com.squareup.otto.HandlerFinder$1.findAllProducers(HandlerFinder.java:33)
            at com.squareup.otto.Bus.register(Bus.java:191)
android android-5.0-lollipop classnotfoundexception otto
4个回答
28
投票

我找到了“解决方案”。只需从您的活动中删除此功能:

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

0
投票

将targetVersion更改为您正在运行的设备的API版本。

当我的设备有4.4(API 19)时,我有targetVersion = 21,将值更改为19解决了问题。


0
投票

我在三星Galaxy 3mini和本地操作员手机上遇到了同样的问题。但我修复了覆盖活动方法。我希望它对你有用。

 @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    try {
        BusApplication.getInstance().register(this);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

0
投票

基于FAG

调用getDeclaredMethods或getMethods时,某些Android版本似乎有反射错误

在这种情况下,PersistableBundle是在API级别21中添加的,当我们在onCreate或onSaveInstanceState等生命周期方法中使用它时会发生此错误。

如果您在代码中使用以下任何方法

@Override
public void onCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
}

@Override
public void onPostCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
    super.onPostCreate(savedInstanceState, persistentState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onRestoreInstanceState(savedInstanceState, persistentState);
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
}

改为使用以下方法(如果没用,则删除上述方法)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
} 

在我的情况下,我在baseActivity中使用此方法并使崩溃

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState) 
}

我只需要替换它

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

问题解决了。

© www.soinside.com 2019 - 2024. All rights reserved.