Android 中的計時器執行緒:綜合指南
問題:
用於建立計時器執行緒的Java 程式碼區塊Android 中的倒數計時器執行緒出現故障。目標是建立一個從 5 分鐘倒數到 0:00 的計時器,更新 TextView 上的時間顯示。
解:
1 。 UI執行緒更新限制:
UI執行緒以外的執行緒不能直接更新使用者介面。在這種情況下,執行緒試圖從後台執行緒修改 TextView,這是不允許的。
2.推薦方法:
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中文網其他相關文章!