Heim > Java > javaLernprogramm > Wie implementiert man einen Countdown-Timer in Android mithilfe von Threads?

Wie implementiert man einen Countdown-Timer in Android mithilfe von Threads?

DDD
Freigeben: 2024-11-05 20:11:02
Original
527 Leute haben es durchsucht

How to Implement a Countdown Timer in Android Using Threads?

Timer-Thread in Android: Eine umfassende Anleitung

Problem:
Ein Java-Codeblock zum Erstellen eines Der Countdown-Timer-Thread in Android funktioniert nicht richtig. Das Ziel besteht darin, einen Timer zu erstellen, der von 5 Minuten bis 0:00 herunterzählt und so die Zeitanzeige in einer Textansicht aktualisiert.

Lösung:

1 . Einschränkung bei der Aktualisierung des UI-Threads:
Andere Threads als der UI-Thread können die Benutzeroberfläche nicht direkt aktualisieren. In diesem Fall versucht der Thread, die Textansicht vom Hintergrundthread aus zu ändern, was nicht zulässig ist.

2. Empfohlene Ansätze:

  • CountDownTimer: Android bietet eine praktische Klasse für Countdowns, die UI-Updates automatisch verarbeitet.
  • Handler: Plant die Ausführung einer Aufgabe in bestimmten Intervallen und bietet eine Möglichkeit, UI-Aktualisierungen von einem Hintergrundthread aus durchzuführen.
  • Timer: Ermöglicht das Planen von Aufgaben in einem separaten Thread, erfordert aber explizit eine Thread-Synchronisierung um UI-Elemente zu aktualisieren.

3. Alternative Implementierungsbeispiele:

a. CountDownTimer

<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>
Nach dem Login kopieren

b. Handler

<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>
Nach dem Login kopieren

c. Timer

<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>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie implementiert man einen Countdown-Timer in Android mithilfe von Threads?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage