解决方案 »

  1.   

    UI还未初始化 你的线程就执行完了,你可以在线程里面 Thread.sleep(10000); 应该会报错。
      

  2.   

    额这个跟UI未初始化有关么?控件开始能显示出来UI就初始化完毕了,现在的问题是非UI线程操作UI确实没错误呢
      

  3.   

    UI线程也是线程,对操作UI进行了保护,防止子线程去修改UI。 你用个按钮去点击线程中修改就会报错,第一次进来UI初始化需要一点点的时间。
      

  4.   


    在oncreate中开线程有时会遇到这个问题
    因为这个时候检测ui更新是否在子线程的代码还没有准备好(你可以理解为还有没被执行到那里),ui就更新完成了
      

  5.   

    在前面加个Thread.sleep试试
      textView1.setText("test3");
      

  6.   


    恩 你的推断应该是对的   我等一切初始化完毕,再点击按钮去修改UI就报错了。我代码如下:
    final Thread t = new Thread() {
    public void run() {
    textView1.setText("test3");
    bar.setProgress(100);
    }
    }; button1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    t.start();
    }
    });
      

  7.   


    这些细节是从哪里得知的呢?我以前不知道UI线程还有没准备好一说,因为在我的印象中UI线程就是主线程,既然开始能显示界面UI了,那么说明主线程已经初始化完毕了,为何还有没准备好一说呢?
      

  8.   

    看看这个吧我在网上搜索了下,参考你提供的博文,做UI更新,会执行当前线程是否是UI线程的检查,即通过检查viewRoot的线程和当前线程是否一致,来判断是否是UI线程,一般来说,ViewRoot所在线程就是UI线程那为什么在onCreate里面能够启动非线程更新UI呢,那是因为onCreate时候,viewRoot还没有被创建,所以没法执行检查,那么在什么时候viewRoot会被创建呢,答案是执行onResume后,viewRoot就能创建好,这个时候就会执行UI线程检查了,
    以上内容参考博文http://www.cnblogs.com/yydcdut/p/3864072.html下面是Activity的复写函数:
    @Override
    public void onStart() {
    super.onStart();
    final TextView finalTextView = contextTextView1;
    final Thread t = new Thread() {
    public void run() {
    Log.e("xface", "onStart");
    finalTextView.setText("test-1");
    }
    };
    t.start();
    }

    @Override
    public void onResume() {
    super.onResume();
    final TextView finalTextView = contextTextView1;
    final Thread t = new Thread() {
    public void run() {
    Log.e("xface", "onResume");
    finalTextView.setText("test4");
    }
    };
    t.start();

    }
    Activity启动顺序是 onCreate->onStart->onResume所以在onCreate和onStart都在调用onResume之前,都能在子线程更新UI,而当onResume执行后,就不行了,就会执行UI检查了,我的代码运行到onResume处就会崩溃,而之前不会
      

  9.   

    因为Progress.setProgress的方法中调用了一个post(Runnable)的方法,这个Runnable最后还是在UI线程下执行的