gpt4 book ai didi

java - Android 我使用了多个 ClassLoader/PathClassLoaders 吗?

转载 作者:行者123 更新时间:2023-11-29 23:19:42 27 4
gpt4 key购买 nike

我在 Android 中遇到类加载器问题。至少我认为它与类加载器有关。所以这就是问题所在...我有一个使用自定义小部件库的项目,我们称之为 CustomDialogView。它是 android View 对象的子类。我有一个我创建的扩展 CustomDialogView 的对话框...因此,重要的是要提及在此过程(以及最终的 Activity )中如何创建和设置 View 的结构。

我的项目是一个 Android 服务,它通过 ContentResolver 将 View 注册到另一个进程。另一个进程然后提取此数据并将根据发送的类创建 View 。因此, View 最终在另一个过程中(在一个 Activity 中)被创建和膨胀。我知道,这很令人困惑,但这是我们的应用程序所使用的方法。因此,最终我可能需要在 View 代码中显示一个对话框。他们给了我一个标准的对象,它使用反射来调用显示对话框方法。所以这里是代码 fragment :

private static void showTheDialog(Object mainActivity, CustomDialogView view, boolean isModal) {
try {
mainActivity.getClass().getMethod("showDialog", View.class, Boolean.TYPE).invoke(mainActivity, view, isModal);
} catch (Exception var4) {
Log.w(TAG, var4.getClass().getName(), var4);
}

}

所以在他们的最后,他们在感兴趣的对象中有这个方法:

public void showDialog(View dialogView, boolean isModal)

所以问题就出在这里。在上面提到的方法(showDialog)中。他们尝试将 dialogView 转换为 CustomDialogView,因此:

CustomDialogView dialogContent = (CustomDialogView)dialogView;

结果我得到一个 ClassCastException。我确认我使用的是在两个项目之间实现 CustomDialogView 的相同版本的库。我在调用 showTheDialog 时打印了类加载器,我得到:

dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.project.myproject-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.this.is.project.myproject-1, /vendor/lib, /system/lib]]]

我在 showDialog(在他们的项目中)中打印出类加载器,我得到:

dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.this.is.thier.project.thierproject-1.apk", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes2.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes3.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes4.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes5.zip", zip file "/data/data/com.this.is.thier.project/code_cache/secondary-dexes/com.this.is.thier.project.thierproject-1.apk.classes6.zip"],nativeLibraryDirectories=[/data/app-lib/com.this.is.thier.project.thierproject-1, /vendor/lib, /system/lib]]]

所以,我们使用了两个不同的类加载器,对吧?我很难理解这个概念。如果您有任何其他问题,请告诉我。

最佳答案

所以,看起来我正在使用多个类加载器。您可能知道,这可能会导致发生类强制转换异常。为了解决,我可以在传递的对象上使用反射。所以这是一个小 fragment :

obj.getClass().getMethod("getterMethod").invoke(obj);

上面的例子是把传入的对象(obj)传入,通过反射获取它的类,然后调用我需要的方法。我希望这对其他人有帮助。现在没有类加载器问题。谢谢。

关于java - Android 我使用了多个 ClassLoader/PathClassLoaders 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54579801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com