Why would onTouch() generate FATAL EXCEPTION when returning false?

霸气de小男生 提交于 2019-12-13 02:37:23

问题


I wrote a simple MotionEvent exercise in which all I do is log the parameters of the event. I do that by implementing OnTouchListener and overriding onTouch() in the main activity.

For one button, I return true at the end of onTouch(). No problems there.

For another button, I return false at the end of onTouch(). This is where it gets interesting. By mere returning 'false', a FATAL EXCEPTION is thrown with a tiny hint which I don't really understand: "recycled twice!".

What does this mean?

Update: per the suggestion in the comment below, I am adding the details of the exception from 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:


Are you recycling and then passing false?

The framework will assume that the MotionEvent is still valid if you return false and will do its own processing with it.

From the docs:

Recycle the MotionEvent, to be re-used by a later caller. After calling this function you must not ever touch the event again.



来源:https://stackoverflow.com/questions/5234571/why-would-ontouch-generate-fatal-exception-when-returning-false

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!