У меня проблемы с 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]]]
Такмы используем два разных загрузчика классов, верно?Мне трудно понять эту концепцию.Пожалуйста, дайте мне знать, если у вас есть другие вопросы, если это необходимо.