2011-03-08 75 views
0

我寫了一個簡單的MotionEvent練習,其中我所做的就是記錄事件的參數。我通過在主要活動中執行OnTouchListener並重寫onTouch()來實現這一點。爲什麼onTouch()在返回false時會生成FATAL EXCEPTION?

對於一個按鈕,我在onTouch()的末尾返回true。那裏沒有問題。

對於另一個按鈕,我在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) 
+0

您需要向我們展示你的logcat的O/P – Reno 2011-03-08 15:33:17

回答

3

你回收,然後通過false

如果您返回false並且將自行處理,則框架將假定MotionEvent仍然有效。

docs

回收MotionEvent,要由稍後呼叫者重新使用 。在調用這個 函數後,您不能再次觸摸 事件。

+0

我想回答你的問題是:除了onTouch的主要活動,我在子類的按鈕覆蓋的onTouchEvent()。只有當onTouch()返回false時,onTouchEvent()纔會被調用,而onTouchEvent()以** event.recycle()結束。返回false; **我不允許在event.recycle()之後返回false嗎?我可以在哪裏瞭解更多關於這方面的信 – 2011-03-08 17:01:06

+1

嘗試我發佈的文檔鏈接瞭解更多信息。是的,如果你要返回false,你不應該調用event.recycle(),因爲框架會在你之後發送相同的MotionEvent給另一個偵聽器。 – 2011-03-08 17:02:57

+0

感謝您的明確。文檔鏈接只包含一行關於recycle()的內容...... Google的人必須假設所有Android開發人員都是天才。 :) – 2011-03-08 17:08:51

相關問題