Android Я использую несколько ClassLoader / PathClassLoaders? - PullRequest
0 голосов
/ 07 февраля 2019

У меня проблемы с ClassLoaders в Android.По крайней мере, я думаю, что это связано с ClassLoaders.Итак, вот в чем проблема ... У меня есть проект, который использует библиотеку пользовательских виджетов, давайте назовем ее CustomDialogView.Это подкласс объекта просмотра Android.У меня есть диалог, который я создал, который расширяет CustomDialogView ... Поэтому важно упомянуть структуру того, как представления создаются и настраиваются в рамках этого процесса (и, в конечном итоге, действия).

Мой проект - это сервис Android, который регистрирует представления в другом процессе через ContentResolver.Затем другой процесс извлекает эти данные и создает представления на основе отправленных классов.Таким образом, представление в конечном итоге создается и раздувается в этом другом процессе (в деятельности).Я знаю, это сбивает с толку, но это метод, который используется для нашего приложения.Итак, в коде представления в конечном итоге мне может понадобиться показать диалог.Они дают мне стандартный объект, и он использует отражение, чтобы вызвать метод диалога показа.Итак, вот фрагмент кода:

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

Такмы используем два разных загрузчика классов, верно?Мне трудно понять эту концепцию.Пожалуйста, дайте мне знать, если у вас есть другие вопросы, если это необходимо.

1 Ответ

0 голосов
/ 13 февраля 2019

Итак, похоже, что я использую несколько загрузчиков классов.Как вы, возможно, знаете, это может вызвать исключение приведения класса.Чтобы решить, я могу использовать отражение на пройденном объекте.Итак, вот небольшой фрагмент:

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

Выше приведен пример получения переданного объекта (obj), использования отражения для получения его класса с последующим вызовом нужного мне метода.Я надеюсь, что это помогает другим.Теперь нет проблем с загрузчиком классов.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...