【问题标题】:ClassNotFoundException: Didn't find class "android.os.PersistableBundle" Otto Android 5.0ClassNotFoundException:找不到类“android.os.PersistableBundle”Otto Android 5.0
【发布时间】:2015-05-05 15:24:54
【问题描述】:

我有一个奇怪的问题。 我有一个部署在 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)

【问题讨论】:

  • 我不确定你是不是对这个问题发表评论的人,但有an outstanding issue on this
  • 是的,是我。我刚刚找到了下面的解决方案。
  • 将 android os 更新到 5.0 为我解决了这个问题

标签: android android-5.0-lollipop classnotfoundexception otto


【解决方案1】:

基于FAG

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

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

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

@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)
}

问题解决了。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 嗯......虽然这可能有效,但这确实是一种解决方法,而不是“解决方案”。开发人员可能希望在 Android 5.0 及更高版本的设备上使用该方法。覆盖旧 API 级别不正常调用的方法不是问题。 Otto 在迭代方法时,应该有异常处理来处理这种情况,恕我直言。
        • 这是一个 Api 21 方法。因此,如果您未满 21 岁,您的应用程序会因为无法执行而崩溃。 developer.android.com/reference/android/app/…, android.os.PersistableBundle)
        • 只需使用 public void onSaveInstanceState(Bundle outState)not ` onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)`
        • onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) 发生了同样的错误。将方法更改为onPostCreate(Bundle savedInstanceState),错误已“解决”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 2017-04-14
        • 1970-01-01
        相关资源
        最近更新 更多