1

5 から 1 までカウントし、毎秒ビューを更新する単純なカウンターを作成しようとしています。ハンドラーを使用せずに単純なループだけで実行しようとしましたが、待機後に 1 が表示されるか、強制的に閉じられます。私もスレッドをいじってみましrunOnUIThreadたが、何かが欠けています。

これが私のコードです:

package com.ammad.test;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.support.v4.app.NavUtils;

public class Main extends Activity {

    TextView tv;
    Button b1;
    Handler mHandler;
    int i = 5;
    private Runnable runnable;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tvShow);
        b1 = (Button) findViewById(R.id.bt1);



        runnable = new Runnable() {
            public void run() {
                // do your stuff - don't create a new runnable here!
                tv.setText(String.valueOf(i));
                i--;
                mHandler.postDelayed(runnable, 500);

            }
        };
        b1.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                mHandler.post(runnable);
                mHandler.removeCallbacks(runnable);

            }
        });

    }

    public void doTheLoop() {

        /*
         * runOnUiThread(new Runnable() {
         * 
         * public void run() { for (int i = 5; i >= 1; i--) { // TODO
         * Auto-generated method stub tv.setText(Integer.toString(i)); for (int
         * j = 0; j < 200000; j++) ; } }
         * `enter code here`
         * });
         */
        // mHandler.post(runnable);
    }
}
4

1 に答える 1

0

どこでインスタンス化していますmHandlerか? コードが欠落していると思います。そうしないと、NullPointerException で失敗します。引数なしのコンストラクターonCreateを使用してインスタンス化するだけでは、UI スレッドのメッセージ キューが使用されるため、これは重要です。

ただし、これには他にも問題があります。メソッド内では、がゼロ未満Runnable.runかどうかを実際にチェックしないため、常にそれ自体で呼び出されます。さらに、非 UI スレッドからUI ( ) を更新しているため、未定義の動作が発生する可能性があります。ipostDelayedsetText

あなたのコードは必要以上に複雑だと思います。この例が単純すぎて実際の意図が隠されている場合、これは単純すぎるかもしれませんが、基本的には機能するものを次に示しますが、コンパイルするには少し編集する必要があります (InterruptedException をキャッチするなど)。

    new Thread() {
        public void run() {
            while(i > 0) {
                Thread.sleep(1000);
                mTextView.post(new Runnable() {
                    public void run() {
                        mTextView.setText(Integer.toString(i--));
                    }
                });
            }
        }
    }.start();
于 2012-07-21T03:22:34.360 に答える