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:
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>
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>
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>
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!