-2

スレッドを使用してカウンターをインクリメントし、それを Android アクティビティのフレームに表示できますか?

Public class MainActivity extendsActivity {
        TextView counter;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            counter = (TextView) findViewById(R.id.TV_counter);
            Thread t = new Thread() {
                public void run() {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            for (int i = 0; i < 5; i++) {
                                try {
                                    counter.setText("" + i);
                                    System.out.println("Value of i= " + i);
                                    sleep(100);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            };
            t.start();
        }
    }

このコードを書きましたが、コンソールでは正しく実行されますが、テキスト ビューがi=4ターミナルに表示され、スリープ時間 (3000) を変更しても問題は解決しません。

4

2 に答える 2

2

まず、ユーザー インターフェイスが応答しなくなる可能性がある UI スレッドをスリープ状態にしないでください。これは決して良いことではありません。グラフィックを更新するためだけに使用してください。コードをこれに置き換えてみてください

  Thread t = new Thread() {
        public void run() {             
            for (int i = 0; i < 5; i++) {                   
                try {
                    final int a = i;
                    runOnUiThread(new Runnable() {
                        public void run() {                        
                            counter.setText("" + a);                            
                        }                       
                    });
                    System.out.println("Value of i= " + i);
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    t.start();

sleep と for ループが UIThread の外で最初のスレッドにあることに気付くでしょう。したがって、基本的にすべての計算は外部で行われ、結果を表示するだけです。

これは、コードの修正と、さらに検討するための提案にすぎません

編集: コードが機能しない理由をよりよく理解するために、TextView に値を設定し、UIThread をスリープ状態に設定した直後に、UIThread がグラフィックスの更新を完了する時間を与える代わりに、設定したスリープ状態が終了した後にブロックします。新しい値であり、彼は以前の値を更新する必要がなかったため、最終的には最後の値のみが表示されます。

これが役に立ち、あなたの仕事を楽しんでくれることを願っています。

于 2013-09-07T12:48:46.320 に答える
0

を使用してCountDownTimer、メソッドで UI を更新できますonTick()(このメソッドは UI スレッドで実行されます)。

int i=0;
        CountDownTimer timer = new CountDownTimer(5000,1000) {

            @Override
            public void onTick(long millisUntilFinished) {
                // this method will be executed every second ( 1000 ms : the second parameter in the CountDownTimer constructor)
                i++;
                txt.setText(i);

            }

            @Override
            public void onFinish() {
                // TODO Auto-generated method stub

            }
        };
        timer.start();
于 2013-09-07T13:13:34.317 に答える