Android我使用多个ClassLoader / PathClassLoaders吗?

问题描述 投票:1回答:1

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

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

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]]]

那么,我们正在使用两个不同的类加载器吗?我很难理解这个概念。如果您有任何其他问题,请告诉我。

java android classloader
1个回答
1
投票

所以,似乎我正在使用多个类加载器。您可能知道,这可能导致类强制转换异常发生。要解决,我可以对传递的对象使用反射。所以这是一个小小的snippit:

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

上面是接受传递的对象(obj)的示例,使用反射获取其类,然后调用我需要的方法。我希望这有助于其他人。现在没有类加载器问题。谢谢。

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