마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼을 누르고 있으면 false가 되는 조건문

0 추천
class MyThread extends Thread{
        MyThread() {
        }
        @Override
        public void run() {
            while(true) {
                if ((time+200<System.currentTimeMillis())&&(!stop)){
                    time=System.currentTimeMillis();
                    rectLeft+=10;
                    myview.postInvalidate();
                }
            }
        }
    }

사각형이 이동하다가 버튼을 누르고 있는 동안만 멈추는 동작을 구현하기 위해 위와 같은 스레드를 생성했습니다. 실제로 실행을 해보니 버튼을 누르는 동안 사각형이 멈추는 것까지는 제 생각과 같았습니다. 그런데 손을 떼면 멈춘 위치부터 사각형이 다시 이동할 거라는 제 예상과는 달리, 멈춘동안도 rectLeft가 증가라도 한 것 마냥 멈춘 위치보다 더 우측에서 사각형이 이동했습니다. 그리고 버튼을 누른 시간이 길수록 사각형이 멈춘위치에서 벗어난 정도도 컸습니다.

어떠한 이유로 이런 결과가 나오는 지 알려주시면 감사하겠습니다.

 

myview는 top,bottom은 고정 left,right는 rectLeft, rectLeft+100인 사각형이 그려진 뷰이고,

stop변수는 아래와 같이 버튼을 누르면 true가 되었다가 손을 떼면 false가 되도록 하였습니다.

btn_stop.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                stop= (event.getAction() != MotionEvent.ACTION_UP);
                return false;
            }
        });

 

익명사용자 님이 2019년 10월 15일 질문

1개의 답변

0 추천
MyThread 에서 while(true) 로 동작 시키고 계시다 보니 Thread 전환 이슈가 있을 것으로 생각됩니다.
sleep 같은 것을 추가하던지 Handler 같은 것을 사용해서 일정 시간마다 주기적으로 체크하게 변경 해 보세요.
익명사용자 님이 2019년 10월 16일 답변
2019년 10월 16일 수정
질문자입니다. 답변해주셔서 감사하지만 제가 기초지식이 전혀 없다보니 어떤게 문제인지 잘 모르겠습니다. 원하던 동작자체는 새 변수를 하나 선언해 버튼을 누를 때 rectLeft값을 저장하고 버튼에서 손을 떼면 다시 그 값을 rectLeft에 주는 것으로 구현했습니다. 그런데 해당동작 구현보다는 어떤 이유로 rectLeft가 버튼을 누르고 있는동안도 변하는지가 궁금한데 아직 그 이유를 모르겠습니다. 혹시 쉽게 풀어서 설명해주시면 감사하겠습니다.
폰에 MyThread 만 동작하고 있는게 아니라 UI Thread, VM Thread 등 여러 Thread가 동작되고 있기 때문에, OS의 스케쥴러에서 Thread를 번갈아 수행합니다.

구현 하신 코드의 경우  MyThread가 쉬지도 않고 계속 동작되는 상태이다 보니  OS의 스케쥴러에서 UI 처리나, 터치 이벤트를 처리할 Thread의  동작 시점이 애매해져서, 원하시는 동작이 안되는 것으로 생각됩니다.

보다 자세한 사항은 아래 링크를 참조 해 보세요..
https://recipes4dev.tistory.com/166
https://happystory.tistory.com/67
...