代码很简单请查看:package com.android.messageexample;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MyActivity extends Activity{    Button mButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mButton=new Button(this);        mButton.setText("Button");        setContentView(mButton);        mButton.setOnClickListener(new OnClickListener(){        public void onClick(View v) {            TextThread noLooerThread = new TextThread();                           //Only the original thread that created a view hierarchy can touch its views.            //这里将报错  提示不是UI主线程无法更改UI            noLooerThread.setName("fail");            noLooerThread.start();        }        });        TextThread noLooerThread = new TextThread();        noLooerThread.setName("success");        noLooerThread.start();    }    public class TextThread extends Thread {        public void run() {            if("success".equals(this.getName())){                 mButton.setText("success");            else if("fail".equals(this.getName())){                mButton.setText("fail");            }         }    }}
第一个线程在Oncread里面运行 成功
第二个线程在onclick()里面运行 报错提示是因为它不是原来创建UI的线程   我怎么知道他是不是原来创建UI的线程?
还有onclick里面可以改变Button的外观  (可能会出现onclick也只是一个线程而已  然而在线程里面开启线程然后再改变就不能改变)
有心人就可能会测试在onCreate里面的那个线程里面再创建一个线程  尝试改变UI列:
package com.android.messageexample;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MyActivity extends Activity{    Button mButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mButton=new Button(this);        mButton.setText("Button");        setContentView(mButton);        mButton.setOnClickListener(new OnClickListener(){        public void onClick(View v) {            TextThread noLooerThread = new TextThread();                           //Only the original thread that created a view hierarchy can touch its views.            //这里将报错  提示不是UI主线程无法更改UI            noLooerThread.setName("fail");            noLooerThread.start();        }        });        TextThread noLooerThread = new TextThread();        noLooerThread.setName("success");        noLooerThread.start();    }    public class TextThread extends Thread {        public void run() {            if("success".equals(this.getName())){                TextThread noLooerThread = new TextThread();                noLooerThread.setName("success1");                //这里也会成功                noLooerThread.start();             }            else if("fail".equals(this.getName())){                 mButton.setText("fail");            }else if("success1".equals(this.getName())){                 mButton.setText("success1");            }        }    }}
谁能告诉我为什么吗?

解决方案 »

  1.   

    UI操作只能在UI线程中操作,如果启动线程需要使用handler机制
      

  2.   

    楼上正解。在非UI线程中操作UI对象是不安全的;可以在非UI线程中定义一些Message,将需要传递的信息通过msg.obj的形式以对象的方式传递出去,Android会把这些Message放到消息队列里面。然后在UI线程中定义相应的handler处理这些Message。这种异步的处理方式就不会有问题了。
      

  3.   

    虽然对这不是非常的了解,但是据我所知,UI线程里面进行的是UI操作,而想在UI线程里面进行其他的操作,可以尝试着用harder机制来发送消息 ,然后其他线程可以通过接受此消息来进行其他的相应的操作。
      

  4.   

    呵呵,这个好理解啊,google的设计还是很好的,为了安全使用handler这样的消息队列
      

  5.   

    我有点不懂在于 oncread 里面启动一个线程可以更改
    为什么在onclick 事件里面启动一个线程则不可更改了?
    但是在onclick里面却可以更改
      

  6.   

    因为onCreate是属于Activity的方法,而onClick是属于动态创建的匿名类对象(OnClickListener)的方法, 自然不能在线程中操作Activity的View。
    如果想在onClick中通过线程操作Activity的View, 可以先让MyActivity实现OnClickListener接口(implements OnClickListener),然后定义属于Activity的onClick方法,最后通过mButton.setOnClickListener(this)设置监听器。
      

  7.   

    楼上的头像貌似不适合搞anroid啊
      

  8.   

    你们说的原来可能是正确的。但是楼主如果想开线程,android自带了一个类,看来你们都不知道,都说了一大堆废话,哈哈
    android.os.AsyncTask<Params, Progress, Result>
    这个类就可以单独开线程
    不过我现在发现利用这个的一个问题,重复几次以后,android.os.AsyncTask<Params, Progress, Result>就没有开启新线程的效果,应该和activity在同一线程了,怀疑是AsyncTask堆栈需要管理,很怀疑有最大值之类的,正在研究,谁知道告诉我,万分感谢(发我空间留言就可以,谢谢)
      

  9.   

    楼上的说的有理,android ui线程就是一个主线程并且是单线程,对ui的操作可以通过Activity.runOnUiThread( Runnable ),View.post( Runnable ),View.postDelayed( Runnable, long ),Hanlder简单的这几个方法就可以应付。复杂就需要使用android提供的一个工具类:AsyncTask。
      

  10.   

    显然,这显示违背了单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线 程中执行