2010-03-15 16 views
7

Este es un problema muy extraño. Mi aplicación que funciona muy bien, pero de alguna manera si dejo mi teléfono durante una hora o dos, mientras que mi aplicación se está ejecutando, me sale el siguiente error cuando vuelva a ella más tarde:Android: ¿Cuándo se descargan las clases en el sistema?

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) 

Sé que es un hecho de que mi clase yoga.database.Manager se cargó en el momento en que se lanzó la aplicación, pero de alguna manera la clase debe haber sido descargada por el sistema cuando salí del teléfono.

¿Android descarga clases automáticamente después de ciertos períodos? ¿Qué puedo hacer cuando mi clase se descarga?

El error anterior hace que mi aplicación se cuelgue, pero puedo volver a ejecutarla fácilmente y funciona perfectamente.

El problema se produce principalmente en mi teléfono HTC Magic con Android 1.6.

Respuesta

7

El Dalvik VM no descarga actualmente las clases. Si lo hiciera, solo podría hacerlo cuando todas las clases asociadas con un cargador de clases en particular se puedan descargar a la vez, lo que no será el caso mientras se ejecuta su aplicación.

Debe comprobar la salida del logcat para ver si hay errores que conduzcan a esta excepción. Una forma de obtener un NoClassDefFoundError es que algo falle durante la inicialización de la clase en cuestión; si eso sucediera, probablemente habría un rastro en el registro.

(Por supuesto, por ahora la salida Logcat es, probablemente, desaparecido hace tiempo, pero si el problema es repetible usted querrá capturar la próxima vez.)

+0

¡Gracias por tu aporte! Investigaré el logcat. – user277827

+0

@fadden, ¿Tiene una fuente/cita para * "Dalvik VM no descarga clases actualmente. Si lo hiciera, solo podría hacerlo cuando todas las clases asociadas con un cargador de clases en particular se puedan descargar a la vez" *? – Pacerier

+3

Para la primera parte, soy la fuente: en general, fui responsable del tiempo de ejecución de Dalvik en ese momento (y continué hasta principios de 2011, poco antes de que el desarrollo en el tiempo de ejecución esencialmente se detuviera para centrarme en lo que ahora es ART). La segunda parte es la manera en que funcionan los cargadores de clases. Para que una clase se descargue, no debe haber referencias a ella, pero el cargador de clases hace referencia a todas las clases, y cada clase hace referencia a su cargador. Por lo tanto, hasta que un cargador y todas las clases cargadas sean inalcanzables, el GC no las descartará. No tengo una referencia autorizada para citar para eso. – fadden

2

¿Estás jugando juegos con cargadores de clase personalizados?

Lo pregunto, porque si yoga.YogaActivity y yoga.database.Manager son clases Java estándar en el mismo archivo APK de Android, no debería tener una en memoria y la otra no. Nunca he visto descargar clases de Android por única vez. De todos modos, nunca antes me he encontrado con este problema en particular.

también:

dejo mi teléfono durante una hora o dos mientras que mi aplicación se está ejecutando

Es posible que desee para aclarar lo que quiere decir con esto. ¿Quiere decir que deja su actividad en primer plano? ¿Quiere decir que presiona INICIO y luego regresa horas después? ¿Te refieres a algo más?

+0

Hola, gracias por su respuesta. No juego con cargadores de clases personalizados, y yoga.YogaActivity y yoga.database.Manager son clases estándar de Java en el mismo archivo APK de Android. En cuanto a dejar el teléfono, dejé el teléfono mientras el YogaActivity estaba en primer plano. Después de un tiempo, la pantalla del teléfono se apagó automáticamente y (presumiblemente) el teléfono se fue a dormir. Cuando me despierto, la actividad en primer plano (YogaActivity) debería aparecer en la pantalla, pero la aplicación se colgó con NoClassDefFoundError en su lugar. – user277827

+2

Me he encontrado con problemas similares. En mi aplicación, una clase tiene variables estáticas. Después de iniciar mi aplicación y luego apagar la pantalla, un rato después encuentro que la aplicación está en un estado imposible. Específicamente, una variable "public static boolean isInitialized = false;" que se modificó en un solo lugar, a un verdadero, se encontró que era falso, aunque la verdadera asignación se había ejecutado claramente.Los síntomas fueron consistentes con la clase que mantenía descargada la estática y se recargó durante un largo período en el que se eliminó la actividad que refirió a la clase, y luego se recreó más tarde. – Mesocyclone

+4

@Mesocyclone: ​​lo más probable es que su proceso haya finalizado y, luego, se haya reiniciado. Eso pasa todo el tiempo. Nunca nunca, nunca nunca, nunca confíe en los miembros de datos estáticos para nada más que un caché u otro lugar transitorio para los datos. – CommonsWare

Cuestiones relacionadas