9

Tengo una galería, que tiene un OnItemSelectedListener y un OnItemClickListener. Así que puedo moverme entre las imágenes, y si hago clic en una, sucede algo más (depende de cuál haya hecho clic). Trabajó muy bien antes de la versión 3.0, pero a partir de ahí (3,0-4,0) después de que se controla el evento onItemClick, produce una excepción grave:Galería onItemClick y onTouchEvent no funcionan juntas desde la versión 3.0 de Android

12-07 18:46:03.008: E/AndroidRuntime(935): FATAL EXCEPTION: main 
12-07 18:46:03.008: E/AndroidRuntime(935): java.lang.NullPointerException 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.GestureDetector.onTouchEvent(GestureDetector.java:587) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.widget.Gallery.onTouchEvent(Gallery.java:937) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.View.dispatchTouchEvent(View.java:5462) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1947) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1708) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1722) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1882) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1361) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1830) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.View.dispatchPointerEvent(View.java:5638) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2827) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2406) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.os.Looper.loop(Looper.java:137) 
12-07 18:46:03.008: E/AndroidRuntime(935): at android.app.ActivityThread.main(ActivityThread.java:4340) 
12-07 18:46:03.008: E/AndroidRuntime(935): at java.lang.reflect.Method.invokeNative(Native Method) 
12-07 18:46:03.008: E/AndroidRuntime(935): at java.lang.reflect.Method.invoke(Method.java:511) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-07 18:46:03.008: E/AndroidRuntime(935): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-07 18:46:03.008: E/AndroidRuntime(935): at dalvik.system.NativeStart.main(Native Method) 
+1

Puedo confirmar que este problema no solo ocurre con 'Gallery', sino también con' ImageView'. El culpable parece ser el 'VelocityTracker' dentro de la vista. –

Respuesta

10

que tenían el mismo problema. Estaba comenzando una actividad desde onItemClick y estaba bloqueando la aplicación.

El problema, creo que es tratar de hacer algo que debe hacerse solo en el hilo principal (como iniciar una actividad).

Implementé un "Controlador" y funciona bien.

crear un controlador como una variable global:

private Handler handler; 

Establecer el manejador dentro onCreate por lo que está en el hilo principal:

handler = new Handler(); 

Crear una entrada al controlador en onItemClick, miradas minas de esta manera:

handler.post(new Runnable() { 

    @Override 
    public void run() { 
     // Do what ever... 
    } 
}); 
+1

No lo entiendo Si el problema era "algo que debería hacerse solo en el hilo principal", ¿no debería aparecer el error en ese "algo"? La forma en que veo el seguimiento de la pila, el error aparece en 'GestureDetector.java: 587', es decir (mirando la fuente): ' mVelocityTracker.recycle(); ' Esto significa que' mVelocityTracker' es en este caso 'nulo '. ¿Cómo se puede deducir de esto que este es un problema de hilo? –

+0

Gracias Valer Dragos por una buena solución +10 –

+0

mismo desde mi lado –

0

También obtuve NPE en onTouchEvent(): 587. Así que comencé a usar GestureDetectorCompat de la biblioteca de soporte y funciona bien.

Cuestiones relacionadas