来自另一个线程的Android更新UI

时间:2013-03-11 14:20:37

标签: android multithreading user-interface

美好的一天,

我想从另一个线程更新我的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对象。但我怎样才能做到这一点。我相信有一个解决方法吗?

由于

2 个答案:

答案 0 :(得分: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方法内部进行更新

答案 1 :(得分:1)

UI元素只能从UI线程更新。使用异步任务来执行背景词,并修改在UI线程上运行的onPostExecute中的UI