Cómo establecer correctamente un punto de interrupción en una clase anidada mediante JDB?
package com.android.internal.telephony.dataconnection; public abstract class DcTrackerBase extends Handler { protected BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (DBG) log("onReceive: action=" + action); [...]
En el código anterior, usando jdb
, me gustaría establecer un punto de interrupción en el método onReceive
. He utilizado el siguiente comando:
> stop in com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive
Y lo obtengo de jdb
:
- ¿Cómo puedo hacer que una celda en un ListView en Android se expanda y contraiga verticalmente cuando se toca?
- ¿Cómo obtener la altitud barométrica en Android?
- Uso de Eclipse para androidSDK, cuando voy a correr, me da la advertencia: La partición de datos ya está en uso. ¡Los cambios no persistirán!
- Acceso a bases de datos en Android
- Android Studio se ejecuta en Windows 7 64bit falla
> Deferring breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$mIntentReceiver.onReceive. It will be set after the class is loaded.
Sé que la clase ya está cargada, así que imagino que jdb no está encontrando el método que quiero. ¿Cómo debo fijar mi punto de interrupción entonces?
- ¿Cómo prevenir el retraso de la interfaz de usuario al actualizar la notificación al descargar el archivo?
- Enviar puntuaciones a las tablas de clasificación de Google Play Games y mostrar nuevos rangos
- Nombres de clases de Android o Java con $ symbol
- SimpleXML Constructor Exception - No se puede crear Inner Class
- Emulador de Android no se inicia
- Eliminar manualmente las actividades de la pila de aplicaciones para Android
- Cómo utilizar ListFragment en Android Swipe Tabs?
- Datos de servicio web de caché de android
El nombre del método wrangled es incorrecto.
En JDB, emita este comando para inspeccionar la clase DcTrackerBase
:
> class com.android.internal.telephony.dataconnection.DcTrackerBase Class: com.android.internal.telephony.dataconnection.DcTrackerBase extends: android.os.Handler subclass: com.android.internal.telephony.dataconnection.DcTracker nested: com.android.internal.telephony.dataconnection.DcTrackerBase$1
Como podemos ver, la clase anidada DcTrackerBase$1
podría ser nuestra clase BroadcastReceiver
. Para verificar, emita el siguiente comando:
> class com.android.internal.telephony.dataconnection.DcTrackerBase$1 Class: com.android.internal.telephony.dataconnection.DcTrackerBase$1 extends: android.content.BroadcastReceiver
Eso es ! Para establecer el punto de interrupción correctamente, escribimos:
> stop in com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive Set breakpoint com.android.internal.telephony.dataconnection.DcTrackerBase$1.onReceive
Está creando una clase anónima cuando anula el onReceive como en el código anterior. Esto debería crear una clase con un nombre en la forma DcTrackerBase $ (un número) dependiendo de cuántas otras clases anónimas / internas tiene en el archivo DcTrackerBase.java. Escribí un ejemplo para replicar tu problema.
public class DebugFun{ public static void main(String[] args){ Object myObj = new Object(){ public String toString(){ int x = 1; x++; return "X is:"+x; } }; System.out.println(myObj); } }
Luego llame
jdb DebugFun
Para iniciar el depurador entonces:
stop in DebugFun$1.toString run
Y ahora el depurador está dentro de la clase interna.
- Cómo cambiar el diseño del elemento recyclerview desde fuera?
- ¿Cómo crear una aplicación de chat en android?