1
private Handler workerHandler; // instance variable of UIThread

onCreate()メソッド内

WorkerThread wt = new WorkerThread();
workerHandler = wt.getHandler();
wt.start();

以下のSeekBarリスナーメソッドを使用して、WorkerThreadのキューにメッセージを送信します

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        tv.setText(String.valueOf(progress));
        workerHandler.sendMessage(workerHandler.obtainMessage(99,String.valueOf(progress)));
    }

ワーカースレッド:

private Handler handler;

//getHandler() method 

public void run() {
        super.run();  
        Looper.prepare();

        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);  
                if (msg.what == 99)
                    Log.d("RTR","Message from Main Thread:"+(String)msg.obj);
            }
        };

        Looper.loop();

しかし、私が変更するSeekBarと、「プログラムが残念ながら停止しました」というメッセージが表示されます。理由は何でしょうか?

更新:問題はワーカースレッドのハンドラーにありますworkerHandler。それはまだnullです。何故ですか?

4

1 に答える 1

1

このコードでは:

WorkerThread wt = new WorkerThread();
workerHandler = wt.getHandler();
wt.start();

1行目は、新しいWorkerThreadオブジェクトをインスタンス化し、そのコンストラクターを呼び出します。注:これは実際に実行中のスレッドを作成したり、メソッドを呼び出したりすることはありませんrun()

getHandler()2行目はオブジェクトを呼び出し、何にも設定されていないWorkerThreadメンバー変数を返します。workerHandlernull

3行目でスレッドを開始します。

問題は、3行目が実行されるまでスレッド内のメソッドrun()呼び出されないことです。

HandlerThreadAndroidが提供するものをご覧ください。これとほとんど同じことをします。チュートリアルまたは例を検索して、その使用方法を確認してください。例:http ://stephendnicholas.com/archives/42

于 2013-02-20T22:13:42.540 に答える