내 응용 프로그램에서 나는 아마도 여러 개의 터치 위치에서 방출되는 입자를 가지고 노력하고있어. 새로운 터치 MotionEvent.ACTION_POINTER_DOWN의 경우, I 예를 onTouchEvent 내부안드로이드 타이머 유출
private static class Touch
{
public Timer timer = new Timer();
public vec position = new vec();
}
:
Touch t = new Touch();
t.position = new vec(event.getX(id), event.getY(id));
t.timer.scheduleAtFixedRate(new TimeredTouchTask(t.position, id), 0, SHOOTING_INTERVAL);
및 보관
나는 점과 관련 타이머를 저장하는 클래스가 지도 내에서 터치 ID를 키로 사용합니다.
MotionEvent.ACTION_POINTER_UP가 실행되면 타이머에서 cancel()을 호출하고지도에서 제거하여 터치를 제거합니다.
마지막으로 이벤트의 유형이 MotionEvent.ACTION_MOVE 인 경우 간단히지도 내부의 모든 Touch 인스턴스를 반복하고 벡터 좌표를 업데이트합니다.
이 기능은 작동하지만 때로는 타이머가 제대로 제거되지 않고, 아무 것도하지 않고 살아있을 때가 있습니다. 그리고 때때로 화면을 만지지도 입자를 실제로 쏘고 있습니다.
어떻게이 코드를보다 견고하게 만들 수있어 항상 올바르게 동작할까요?
EDIT1 : ACTION_POINTER_UP
내가private void removeTouch(int id)
{
Touch t = _touch.get(id);
if(t != null)
{
if(t.timer != null)
{
t.timer.cancel();
t.timer = null;
}
t = null;
_touch.remove(id);
}
}
EDIT2이 방법을 호출
의 코드 : 일부 로그를 검사하여 전체 목록 LINK
나는 발견 그 예를 들어 : 터치 손가락 # 1 손가래 # 2 손가래 # 3 해제 손가락 # 3 해제 손가락 # 2 출시 손가락 # 1
는 확인 만하고 있습니다 :
터치 손가락 # 1 터치 손가락 # 2 터치 손가락 # 3 출시 손가락 # 1 출시 손가락 # 2 릴리스 손가락 # 3
은 마지막 타이머를 유출합니다. ID와 인덱스를 확실히 망치고 있다고 생각합니다. 등 getX(id)
의 사용에서 판단
ACTION_POINTER_UP을 처리하고 타이머를 취소 할 때 코드를 게시 할 수 있습니까? – Matthieu
업데이트 됨 ... 아마도 잘 수행되지 않았을 수 있습니다. –
그게 나에게 잘 어울리는 군 ... 아마도 가장 좋은 것은 당신이 디버그 프린트 (id로)를 추가하고 어쩌면 테스트가 실패했는지 (! = null), 또는 콜 취소 할 수는 있지만 실제로는 효과가 없습니다 ... – Matthieu