-1

良い一日、

UIの画像ボタンを別のスレッドから更新したい。以下は、メインスレッドのonCreate()メソッドで実行するコードです。

    new Thread(new Runnable() {
        public void run() {

            ImageButton btn = (ImageButton) findViewById(R.id.connected_icon);
            if (netConnection.IsConnected()) {
                // Change icon to green
                btn.setImageResource(R.drawable.green_small);
            } else {
                // Change icon to red
                btn.setImageResource(R.drawable.red_small);
            }
            try {
                // Sleep for a second before re_checking.
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }).start();

いいえ、これを実行すると、LogCatでエラーが発生し、別のスレッドからUIを更新できないと表示されます。

同じUIオブジェクトを一度に更新する複数のスレッドを取得しないように、一度これが当てはまるsoemを読んだことを覚えています。しかし、どうすればこれを達成できますか。回避策があると確信していますか?

ありがとう

4

2 に答える 2

4

スレッドから UI コンポーネントに直接アクセスすることはできません。これを行う正しい方法は、ハンドラーを作成することです

 final Handler mHandler = new Handler() { 

     public void handleMessage(Message msg) { 

     } 
 }; 

そして、UIThreadにメッセージを送信します

 Message msg = new Message();
 //TODO: add stuff to message
 mHandler.sendMessage(msg);

あなたのスレッドの中に。

これを行うか、代わりに AsyncTask を使用して、pre、post、または progressUpdate メソッド内から更新を行います。

于 2013-03-11T14:29:20.153 に答える
1

UI 要素は、UI スレッドからのみ更新する必要があります。非同期タスクを使用してバックグラウンド ワードを実行し、UI スレッドで実行される onPostExecute で UI を変更します。

于 2013-03-11T14:24:05.720 に答える