原因:

view控件不是线程安全的,所以更新UI操作都必须在UI线程中完成,而不能在非UI线程中。

解决方法:

使用Handler,其实每个线程都有自已的handler,来处理自己的消息队列,当多线程间需要通信时,可以使用handler。

1、在可以操作UI的代码处创建Handler对象。

final Handler uiHandler = new Handler();

2、把更新UI的逻辑放到Runnable对象中

final Runnable mUpdateResults = new Runnable() {
        public void run() {
            updateUI();
        }
    };

3、在子线程的方法中调用handler的post的方法,入参是runnable对象

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

     NetworkOperation();//一个很费时间的I/O操作,比如网络或文件读写等等。

      }

    protected void NetworkOperation() {

        Thread t = new Thread() {
            public void run() {
                doSomething(); //处理得到结果了,这里一些内容保存在主类的成员变量中
                cwjHandler.post(mUpdateResults); //高速UI线程可以更新结果了
            }
        };
        t.start();
    }

 

收藏 打印