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.

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

также:

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

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