2011-03-08 3 views
0

나는 이벤트의 매개 변수를 기록하는 간단한 MotionEvent 연습을 작성했습니다. OnTouchListener을 구현하고 onTouch()를 덮어 쓰면됩니다. 주 활동입니다.false를 반환 할 때 onTouch()가 왜 FATAL EXCEPTION을 생성합니까?

onTouch() 끝 부분에서 사실을 반환합니다. 거기에 문제 없습니다.

다른 버튼의 경우 onTouch() 끝 부분에서 거짓을 반환합니다. 이것은 흥미로운 곳입니다. 단순하게 '거짓'을 되 돌리는 것만으로, 나는 정말로 이해할 수없는 작은 힌트, 즉 "두 번 재활용!"로 치명적인 예외를 던집니다.

이것은 무엇을 의미합니까?

업데이트 : 아래의 코멘트, 내가 로그 캣에서 예외의 세부 사항을 추가하고의 제안에 따라 :

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

답변

3

당신이 다음 재활용되고 false을 통과?

프레임 워크는 false를 반환하고 MotionEvent가 자체 처리를 수행 할 경우 MotionEvent가 유효하다고 가정합니다. docs에서

:

재순환 MotionEvent는 나중에 호출자가 을 다시 사용할 수 있습니다. 이 함수를 호출 한 후에는 이벤트를 다시 만지면 안됩니다.

+0

당신의 질문에 대한 대답은 예라고 생각합니다. 주 활동의 onTouch 외에도 서브 클래 싱 된 버튼에서 onTouchEvent()를 재정의합니다. onTouch()가 false를 반환 할 때만 onTouchEvent()가 호출되고 onTouchEvent()는 ** event.recycle()으로 끝납니다. return false; ** event.recycle() 후에 false를 반환 할 수 있습니까? 이 부분에 대해 더 자세히 알 수있는 곳은 어디입니까? –

+1

자세한 정보를 위해 게시 한 문서 링크를 사용해보십시오. 네, false를 반환하면 event.recycle()을 호출하면 안됩니다. 왜냐하면 프레임 워크가 동일한 MotionEvent를 다른 리스너에게 보내주기 때문입니다. –

+0

이 점을 명확히 해 주셔서 감사합니다. docs 링크에는 recycle()에 대한 행이 하나만 있습니다. Google의 모든 사용자는 모든 Android 개발자가 모두 천재라고 가정해야합니다. :) –

관련 문제