Timer Thread dans Android : un guide complet
Problème :
Un bloc de code Java pour créer un Le fil du compte à rebours dans Android fonctionne mal. L'objectif est de créer un compte à rebours de 5 minutes à 0h00, mettant à jour l'affichage de l'heure sur un TextView.
Solution :
1 . Restriction de mise à jour du fil de l'interface utilisateur :
Les fils de discussion autres que le fil de l'interface utilisateur ne peuvent pas mettre à jour directement l'interface utilisateur. Dans ce cas, le fil tente de modifier TextView à partir du fil d'arrière-plan, ce qui n'est pas autorisé.
2. Approches recommandées :
3. Exemples de mise en œuvre alternatifs :
a. Compte à rebours
<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. Gestionnaire
<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. Minuterie
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!