일전에 올렸습니다만 아직 해결을 못해 다시 올려 봅니다.
달리 해본 방법은 runUIThread를 해봤구요 --> 똑같은 현상 발생
"그냥가자"님 flg 방식은 곧장 종료를 보장 못한다고하셨잖아요...
그럼 곧장 종료 하려면 뭘 해야 하나요??
아무리 해도 안됩니다 좀 도와 주세요
이하 일전에 올렸던 내용임...
#######################################
아래와 같이 쓰레드 핸들러를 구현했습니다
버튼 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
@Skarz
Thread 한먼말 실행 시킨다는 말은 start()를 한번만 한단 말씀이죠? 그 후에는 flg로 시작/정리를 설정하라는 건가요?
@그냥가자
네~! inturrupt도 사용해봤습니다. 그런데 제가 뭘 잘못했는지 UP했는데 더 많은 스레드가 실행이 되네요 ㅠ.ㅠ
handler에 메시지를 보내는 동작이 다른 스레드에서 계속 들어갔기 때문에
손을 떼는 순간에 남아있는 메시지가 있을 수 있습니다.
이것은 스레드 중단하고는 완전히 다른 얘기죠. 스레드가 제때 멈춰도 초과분이 있을 수 있다는 얘기입니다.
심지어 1개의 스레드만 돈다고 해도 마찬가지입니다.
위같은 논리적 흐름을 유지하면서 목적하신 것이 100프로 이루어지게 하는 방법은 제가 볼때 없습니다.
다운 이벤트가 워낙 자주 올라오므로 그냥 다운이벤트때 sendMessage하는 편이 나을수 있습니다. 스레드 없이요.
@Skarz
@그냥가자
@건방진프로그래머
답변 감사합니다. 스레드 문제도 있겠지만 하다보니 다른데서 문제를 찾았습니다. 위의 소스에서
38. case MotionEvent.ACTION_UP:
39. runFlgY = false; 40. break; 이부분이 있는데요... runFlgY를 false 하고 execAni()라는 메소드를 호출합니다.(상관없을줄 알고 빼고 올렸습니다)그런데 이execAni라는 곳에서 하는것이ScaleAnimation scale2 = new ScaleAnimation(1.0f, 1.75f, 1.0f, 1.75f, Animation.RELATIVE_TO_SELF, fX, Animation.RELATIVE_TO_SELF, fY); scale2.setDuration(5500); scale2.setFillAfter(true); lytParent.startAnimation(scale2);
이렇게 하는데요... execAni를 빼면 바로 종료 되는데.. 애니를 실행하면 살짤 딜레이되는 현상이 있더군요..
아무튼 여러분들 감사합니다.




사실 터치 리스너를 구동할때마다 BackThreadY 인스턴스를 생성시켜 가동시는것 자체부터가 조금 잘못된거 같습니다.
DDMS의 thread로 보시면 한눈에 아실꺼라고 봅니다.
외부에서 Thread는 1번 실행시키고 그다음부터 반응하는걸로 만드시는게 날꺼라 봅니다.
솔직히 Thread가 몇개가 실행되건 runFlgY가 전역변수로 되어 있으면 false일때 더이상 Loop를 돌지 않겠지만
위의 Log처럼 정상적인 Sync를 맞추긴 어렵겠죠. 여러개의 Thread니까요.