2

Android のループで UI を更新しようとしていますが、間違ったスレッドにいるというエラーが表示されます。ハンドラーを使用しているため、理由がわかりません。誰か提案はありますか?

TextView textView;
protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        textView.setText((String)msg.obj);  
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_thread_sleep);
    textView=(TextView) findViewById(R.id.TextView1);
    init();
}

public void init()
{
    CounterThread counterThread=new CounterThread();
    counterThread.start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_thread_sleep, menu);
    return true;
}

class CounterThread extends Thread {

    @Override
    public void run() {
        super.run();
        int counter=0;

        handleString("in Thread handler");
        try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}

        while(counter<10)
        {
            counter++;
            String counterString=String.valueOf(counter);
            handleString(counterString);

            try{Thread.sleep(2000); }catch(Exception e){Log.d("Exception", e.toString());}
        }//while
    }//run 

    public void handleString(String string)
    {
        Message msg=handler.obtainMessage();
        msg.obj="counter"+" "+string;
        handler.handleMessage(msg);
    }

}//thread
4

2 に答える 2

3

Handlerを間違って呼び出しています。バックグラウンド スレッドから呼び出しhandler.sendMessage()て、メッセージをキューに投稿します。これは、その後、処理するときにのhandleMessage()メソッドを呼び出します。Handler

補足として、UI を再度更新する前にバックグラウンド スレッドを使用して一定時間待機するだけの場合は、sendMessageDelayed()代わりに使用することを検討してください。 Handler秒を作成しなくても、独自のタイミングを実行できますThread

于 2012-10-11T20:44:03.807 に答える
-1

これは、UI スレッドでコードを実行していないために発生します。したがって、メソッド runOnUiThread を使用する必要があります: http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )

だから、それはこのようなものです:

protected Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        final String msgString = (String)msg.obj;
        runOnUiThread(new Runnable() {
            @Override
            void run() {
                textView.setText(msgString);
            }
        });
    }
};
于 2012-10-11T20:58:51.297 に答える