Android: когда классы выгружаются системой?

Это очень странная проблема. Мое приложение работает нормально, но почему-то, если я оставляю свой телефон на час или два во время работы моего приложения, я получаю следующую ошибку, когда возвращаюсь к нему позже:

java.lang.NoClassDefFoundError: yoga.database.Manager
at
yoga.YogaActivity.openDatabase(YogaActivity.java:294)
at
yoga.YogaActivity.initData(YogaActivity.java:275)
at
yoga.YogaActivity.onCreate(YogaActivity.java:102)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.access$2100(ActivityThread.java:116)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4203)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
at dalvik.system.NativeStart.main(Native Method)

Я точно знаю, что мой класс yoga.database.Manager был загружен во время запуска приложения, но каким-то образом класс должен был быть выгружен системой, когда я оставил телефон.

Android выгружает классы автоматически после определенных периодов? Что я могу сделать, когда мой класс выгружается?

Вышеуказанная ошибка приводит к сбою моего приложения, но я могу легко перезапустить его, и оно работает нормально.

Проблема возникает в основном на моем телефоне HTC Magic под управлением Android 1.6.

2 ответа

Решение

В настоящее время Dalvik VM не выгружает классы. Если это произойдет, он сможет сделать это только тогда, когда все классы, связанные с определенным загрузчиком классов, могут быть выгружены одновременно, что не будет иметь место во время работы вашего приложения.

Вам необходимо проверить вывод logcat на наличие ошибок, приведших к этому исключению. Один из способов получить NoClassDefFoundError - что-то не получится во время инициализации рассматриваемого класса; если это произойдет, вероятно, в журнале будет след.

(Конечно, к настоящему времени выходные данные logcat, вероятно, давно исчезли, но если проблема повторяется, вы захотите захватить ее в следующий раз.)

Вы играете в игры с пользовательскими загрузчиками классов?

Я спрашиваю, потому что если yoga.YogaActivity а также yoga.database.Manager являются стандартными классами Java в одном и том же файле Android APK, у вас не должно быть одного в памяти, а другого нет. Я никогда не видел, чтобы Android разгрузил классы на разовой основе - по крайней мере, я никогда раньше не сталкивался с этой конкретной проблемой.

Также:

Я оставляю свой телефон на час или два, пока мое приложение работает

Вы можете уточнить, что вы имеете в виду под этим. Вы имеете в виду, что вы оставляете свою деятельность на переднем плане? Вы имеете в виду, что вы нажимаете ДОМОЙ, а затем возвращаетесь к нему часами позже? Вы имеете в виду что-то еще?

Другие вопросы по тегам