-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。

我记得曾经读过 soem,这样你就不会让多个线程同时更新同一个 UI 对象。但我怎么能做到这一点。我确定有解决办法吗?

谢谢

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 线程更新。使用异步任务做后台word,在onPostExecute中修改UI,运行在UI线程上

于 2013-03-11T14:24:05.720 回答