Почему onTouch () генерирует FATAL EXCEPTION при возврате false? - PullRequest
1 голос
/ 08 марта 2011

Я написал простое упражнение MotionEvent, в котором все, что я делаю, - записываю параметры события.Я делаю это, внедряя OnTouchListener и переопределяя onTouch () в основной активности.

Для одной кнопки я возвращаю true в концеonTouch ().Никаких проблем там нет.

Для другой кнопки я возвращаю false в конце onTouch ().Вот где это становится интересным.Простое возвращение «false» приводит к ФАТАЛЬНОМУ ИСКЛЮЧЕНИЮ с крошечной подсказкой, которую я не совсем понимаю: «переработано дважды!».

Что это значит?

Обновление: в соответствии спредложение в комментарии ниже, я добавляю детали исключения из LogCat:

03-08 10:35:14.275: ERROR/AndroidRuntime(521): FATAL EXCEPTION: main
03-08 10:35:14.275: ERROR/AndroidRuntime(521): java.lang.RuntimeException: MotionEvent{405215b0 action=0 x=66.0 y=78.0 pressure=1.0 size=0.0} recycled twice!
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at android.view.MotionEvent.recycle(MotionEvent.java:659)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at android.os.Looper.loop(Looper.java:123)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at android.app.ActivityThread.main(ActivityThread.java:3647)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at java.lang.reflect.Method.invokeNative(Native Method)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at java.lang.reflect.Method.invoke(Method.java:507)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-08 10:35:14.275: ERROR/AndroidRuntime(521):     at dalvik.system.NativeStart.main(Native Method)

1 Ответ

4 голосов
/ 08 марта 2011

Перерабатываете ли вы, а затем передаете false?

Фреймворк будет считать, что MotionEvent все еще действует, если вы вернете false, и будет выполнять свою собственную обработку с ним. docs :

Перезапустите MotionEvent, чтобы использовать его позже.После вызова этой функции вы больше никогда не должны касаться события.

...