スレッドを使用して Android にカウントダウン タイマーを実装する方法

DDD
リリース: 2024-11-05 20:11:02
オリジナル
444 人が閲覧しました

How to Implement a Countdown Timer in Android Using Threads?

Android のタイマー スレッド: 総合ガイド

問題:
Android のカウントダウン タイマー スレッドが誤動作しています。目標は、5 分から 0:00 までカウントダウンするタイマーを作成し、TextView の時間表示を更新することです。

解決策:

1 。 UI スレッド更新の制限:
UI スレッド以外のスレッドはユーザー インターフェイスを直接更新できません。この場合、スレッドはバックグラウンド スレッドから TextView を変更しようとしていますが、これは許可されていません。

2.推奨されるアプローチ:

  • CountDownTimer: Android は、UI の更新を自動的に処理するカウントダウン用の便利なクラスを提供します。
  • Handler: 特定の間隔で実行されるタスクをスケジュールし、バックグラウンド スレッドから UI 更新を実行する方法を提供します。
  • タイマー: 別のスレッドでタスクをスケジュールできますが、明示的にスレッド同期が必要ですUI 要素を更新します。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!