>  기사  >  Java  >  스레드를 사용하여 Android에서 카운트다운 타이머를 구현하는 방법은 무엇입니까?

스레드를 사용하여 Android에서 카운트다운 타이머를 구현하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-05 20:11:02433검색

How to Implement a Countdown Timer in Android Using Threads?

Android의 타이머 스레드: 종합 가이드

문제:
Android의 카운트다운 타이머 스레드가 제대로 작동하지 않습니다. 목표는 5분에서 0:00까지 카운트다운하는 타이머를 만들어 TextView의 시간 표시를 업데이트하는 것입니다.

해결책:

1 . UI 스레드 업데이트 제한:
UI 스레드 이외의 스레드는 사용자 인터페이스를 직접 업데이트할 수 없습니다. 이 경우 스레드는 백그라운드 스레드에서 TextView를 수정하려고 시도하고 있으며 이는 허용되지 않습니다.

2. 권장 접근 방식:

  • CountDownTimer: Android는 UI 업데이트를 자동으로 처리하는 편리한 카운트다운 클래스를 제공합니다.
  • 핸들러: 특정 간격으로 실행되도록 작업을 예약하고 백그라운드 스레드에서 UI 업데이트를 수행하는 방법을 제공합니다.
  • 타이머: 별도의 스레드에서 작업 예약을 허용하지만 명시적으로 스레드 동기화가 필요합니다. UI 요소 업데이트

3. 대체 구현 예:

a. 카운트다운타이머

<code class="java">public class MainActivity extends Activity {

    Button b;
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.textView1);
        b = (Button) findViewById(R.id.button1);

        b.setOnClickListener(v -> startTimer(120000)); // start countdown for 2 minutes
    }

    private void startTimer(long time) {
        CountDownTimer counter = new CountDownTimer(time, 1000){
            public void onTick(long millisUntilDone) {
                tv.setText("You have " + millisUntilDone + "ms");
            }

            public void onFinish() {
                tv.setText("DONE!");
            }
        }.start();
    }
}</code>

b. 핸들러

<code class="java">Handler m_handler;
Runnable m_handlerTask;
int timeLeft = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    m_handler = new Handler();
    m_handlerTask = () -> {
        if (timeLeft >= 0) {
            Log.i("timeleft", "" + timeLeft);
            timeLeft--;
        } else {
            m_handler.removeCallbacks(m_handlerTask); // cancel run
        }
        m_handler.postDelayed(m_handlerTask, 1000);
    };
    m_handlerTask.run();
}</code>

c. 타이머

<code class="java">int timeLeft = 100;
Timer _t = new Timer();

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

    _t.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(() -> {
                Log.i("timeleft", "" + timeLeft);
                // update UI elements here
            });
            if (timeLeft > 0) {
                timeLeft--;
            } else {
                _t.cancel();
            }
        }
    }, 1000, 1000);
}</code>

위 내용은 스레드를 사용하여 Android에서 카운트다운 타이머를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:파일 자동 닫기다음 기사:파일 자동 닫기