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

스톱워치 예제 동작 오류

0 추천

안녕하세요

스톱워치를 예제로 만들어 보았는데

다 잘 되는데

리셋버튼이 오류가 있는거 같습니다.

시간 멈춤후에 리셋하면 잘 되는데

시간이 흐르고 있는 상태에서 리셋을 하면 오류가 나지는 않지만

제대로 동작을 하지 않습니다.

 

도움 부탁드립니다~

 

public class MainActivity extends AppCompatActivity {

    TextView timer_Item_text_time;
    ImageView timer_Item_Play;
    ImageView timer_Item_Reset;

    final static int INIT = 0;
    final static int RUN = 1;
    final static int PAUSE = 2;

    int curStatus = INIT;
    long baseTime, pauseTime;

    Handler myTimer = new Handler(){
        public void handleMessage(Message msg) {
            timer_Item_text_time.setText(getTimeCheck());
            myTimer.sendEmptyMessage(0);
        }
    };

    public String getTimeCheck(){
        long start = 0;
        long now = SystemClock.elapsedRealtime();
        long output = start + (now - baseTime);
        long h = (output/1000/60/60) % 60;
        long m = (output/1000/60) % 60;
        long s = (output/1000) % 60;

        String outTime = String.format("%02d:%02d:%02d",
                h, m, s);
        return outTime;
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        timer_Item_text_time = (TextView) findViewById(R.id.timer_Item_text_time);
        timer_Item_Play = (ImageView) findViewById(R.id.icon_timer_Item_Play);
        timer_Item_Reset = (ImageView) findViewById(R.id.icon_timer_Item_Reset);

        //시간 동작
        timer_Item_Play.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view ) {
                if(curStatus == INIT) {
                    Toast.makeText(getApplicationContext(), "플레이버튼 클릭됨", Toast.LENGTH_LONG).show();
                    timer_Item_Play.setImageResource(R.drawable.stop1);
                    timer_Item_Reset.setVisibility(View.VISIBLE);
                    baseTime = SystemClock.elapsedRealtime();
                    myTimer.sendEmptyMessage(0);
                    curStatus = RUN;
                }else if(curStatus == RUN){
                    myTimer.removeMessages(0);
                    pauseTime = SystemClock.elapsedRealtime();
                    timer_Item_Play.setImageResource(R.drawable.play1);
                    curStatus = PAUSE;
                }else if(curStatus == PAUSE){
                    long now = SystemClock.elapsedRealtime();
                    baseTime +=(now - pauseTime);
                    myTimer.sendEmptyMessage(0);
                    timer_Item_Play.setImageResource(R.drawable.stop1);
                    curStatus = RUN;
                }
            }
        });

        timer_Item_Reset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "리셋버튼 클릭됨", Toast.LENGTH_LONG).show();

                timer_Item_text_time.setText("00:00:00");
                timer_Item_Play.setImageResource(R.drawable.play1);
                timer_Item_Reset.setVisibility(View.INVISIBLE);
                curStatus = INIT;
            }
        });
    }
}

 

창천항로 (140 포인트) 님이 2016년 10월 19일 질문

1개의 답변

0 추천
리셋버튼의 OnClick 이벤트에 아래 구문 추가해주세요.

핸들러에 계속해서 메세지가 전송되어 발생하는 문제로 메세지를 삭제해주시면 됩니다.

 

myTimer.removeMessages(0);
바램 (19,650 포인트) 님이 2016년 10월 19일 답변
아 해결되었네요
정말 명쾌한 답변 감사합니다.
...