아래와 같이 쓰레드 핸들러를 구현했습니다
버튼 ACTION_DOWN일때 run이 실행되고 ACTION_UP이면 run을 멈춥니다. (runFlgY로 설정)
이상한건...ACTION_UP을 했을때...
InputReader(134): dispatchTouch::touch event's action is 1 이 호출되면서
2~3번 스레드가 더 실행되는 겁니다. ㅠ.ㅠ
아래 LogCat의 경우는 498에서 버튼Up을 했는데... 495까지 실행이 된경우 입니다.
뭐가 문제 인지... 알 수가 없습니다.
여러 고수님들 도와 주세요~! ㅠ.ㅠ
/**
* Y축 핸들러
*/
Handler mHandlerY = new Handler() {
@Override
public void handleMessage(Message msg) {
horizonParam.setMargins(valX, msg.arg1, 0, 0);
lytMove.setLayoutParams(horizonParam);
}
};
/**
* Y축 스레드
*/
class BackThreadY extends Thread {
Handler mHandlerY;
BackThreadY(Handler handler) {
mHandlerY = handler;
}
@Override
public void run() {
while (runFlgY) {
y--;
Message msg = Message.obtain(mHandlerY, 0, y, 0);
Log.i("SCR_Y", 550 + "," + y);
mHandlerY.sendMessage(msg);
try {Thread.sleep(mSpeed);} catch (InterruptedException e) {;}
}
}
}
// Y축 터치 리스너
btnMove.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mThreadY = new BackThreadY(mHandlerY);
mThreadY.setDaemon(true);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mThreadY.start();
break;
case MotionEvent.ACTION_UP:
runFlgY = false;
break;
}
return false;
}
});
LogCat
12-12 09:36:58.787: INFO/SCR_Y(2324): 550,501 12-12 09:36:58.791: INFO/SCR_Y(2324): 550,500 12-12 09:36:58.795: INFO/SCR_Y(2324): 550,499 12-12 09:36:58.795: INFO/SCR_Y(2324): 550,498 12-12 09:36:58.795: INFO/InputReader(134): dispatchTouch::touch event's action is 1 12-12 09:36:58.795: INFO/InputDispatcher(134): Delivering touch to current input target: x: 408.851776, y: 757.947449, action: 1, channel '40a79130 com.ASDF/com.ASDF.main.asdf (server)' 12-12 09:36:58.799: INFO/SCR_Y(2324): 550,497 12-12 09:36:58.803: INFO/SCR_Y(2324): 550,496 12-12 09:36:58.806: INFO/SCR_Y(2324): 550,495
@그냥가자
어김 없이 그냥가자님 답변이 군요~! ^^ 감사합니다~!
그렇다면.. flg방식으로는 해결 할 수 없다는 말씀이군요 ㅠ.ㅠ
사실 removeMessage인가? 이걸 이용해보려 했는데 잘 안되서 flg방식을 도입한겁니다..
결국 다시 원점으로 돌아가야 하나요~! 쩝~~~!
View 객체에 대한 수정때문에 Handler 작업 하신거죠?
몇 번 더 돌아가는게 문제라면 Handler 안에도 flg 적용하면 될거 같은데요?
Handler 안쓰고 runOnUiThread 했어도 좋을거 같구요
Handler와 thread의 차이점이라면, Handler는 UIThread 의 EventLoop를 탄다는 점,
View에 대한 접근 권한을 갖는다는 점입니다.
지금 문제가, Handler와 Thread 간의 비동기 현상인데요
Handler는 MainThread의 EventQueue를 dequeue하면서 동작하기때문에
이를 제어할 방법이 없습니다.
정 그렇다면, 차라리 자체 blocking queue를 구현하시고 thread의 결과를 queue에 넣으세요
while(1) 로 queue에서 하나씩 꺼내서 view update 작업을 하시구요
thread가 종료될때 해당 queue를 clean 해버리면 될것 같습니다.




핸들러에 작업을 열심히 밀어넣어둔게 남았겠죠....
그리고 저런 flag방식은 곧장 종료되는 것을 보장하지 못합니다.
대체로 잘 돌긴 하지만요.... 완벽하진 않습니다. 1회는 더 돌수 있습니다.
2~3번 더돈다는것은 아마도 핸들러에 보내놓은게 더 도는거 같습니다.