Android のタイマー スレッド: 総合ガイド
問題:
Android のカウントダウン タイマー スレッドが誤動作しています。目標は、5 分から 0:00 までカウントダウンするタイマーを作成し、TextView の時間表示を更新することです。
解決策:
1 。 UI スレッド更新の制限:
UI スレッド以外のスレッドはユーザー インターフェイスを直接更新できません。この場合、スレッドはバックグラウンド スレッドから TextView を変更しようとしていますが、これは許可されていません。
2.推奨されるアプローチ:
3.代替実装例:
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.ハンドラー
<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 中国語 Web サイトの他の関連記事を参照してください。