由于android的UI主界面更新是单线程的,所以在子线程更新界面会提示错误,为此我做了相关实验。可能由于我对主线程和子线程的理解不当,未能实验出子线程更新的提示错误。望大虾帮忙。
我的具体做法为:键一个activity和一个线程thread。在activity中启动thread。我认为thread是子线程,所以在thread中添加了对界面更新的操作,最后没有报错。难道thread不是子线程?

解决方案 »

  1.   

    你使用了thread.start()方法了吗?还是直接在里面实现的runable接口,使用前者肯定是另起了个线程,后者可能还是在主线程里面,使用这个方法 Thread.currentThread().getId(),在log里面打印看线程id和主线程id是否相同,就知道你有没有创建新线程了,另外,在子线程里面是不能对ui进行操作的。可能是你没有创建新线程,所以没有报错。
      

  2.   

    启动线程了, 后来我启动了两个线程,在线程里面设置了延迟等待,等待结束后再更改UI界面,此时会报错,接着用handler进行UI界面更新就不报错了,这个时候应该存在通信了。但是两个线程里面都没有延迟等待的话,在线程里面直接进行更新操作,AP启动生成界面,UI被较后启动的线程的操作更新,也没有报错,这个就弄不明白了。
      

  3.   

    在主线程中调用Thread.currentThread(),把主线程句柄保存下来。
    在需要比较的地方,同样调用Thread.currentThread(),获取当前线程句柄,然后进行比较即可。
      

  4.   

    可以看一下Activity类中,runOnUIThread()方法的实现。
      

  5.   

    查看了ID,实现的ruanable 和 thread.start()都有不同的线程ID号。我想问一下activity的oncreat()方法是不是启动了UI主线程? 谢谢,哈哈。
      

  6.   

    应该说是主线程调用了onCreat()方法!
      

  7.   

    handle机制就是为了避免子线程操作ui而设计的。因为handle里面的ui操作是在主线程的,楼主如果需要一个简单的线程操作,可以考虑AsyncTask。这个比较简单实现。
      

  8.   

    我就是想体验下UI更新单线程操作,想让他出现错误提示,现在已经有错误提示了,不过新的问题是,在主线程中开启的子线程,子线程有对UI的操作,但是没有延迟等待,系统就运行正常,没有错误提示了。也不知道是怎么回事
      

  9.   

    我看了下activity的生命周期,activity的线程是从onCreat()方法调用开始的,但是在onCreat()方法前,主线程就存在了吗?
      

  10.   

    我的理解是主线程调用oncreate()等一系列函数创建了activity的界面
      

  11.   


    public class DrawPicturesActivity extends Activity implements OnClickListener{
      public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            .
    .
    .
            new Thread(pthread).start();
            nThread.start();
    .
    .
    .    }
    .
    .
    .
    }public class PictureThread implements Runnable{
    .
    .
    .
    public PictureThread(DrawPicturesActivity context)
    {
    tView = (EditText)context.findViewById(R.id.editText1);
    } private Handler threadHandler = new Handler(Looper.myLooper())
    {
    public void handleMessage(Message msg)
    {
    tView.setText("I can come to this room quietly."); }
    }; public void run()
    {
    Message msg = threadHandler.obtainMessage();
    tView.setText("I can come to this room quietly.  is that right?");//该操作能成功执行
    try
    {
    Thread.sleep(5000);
    }
    catch (Exception e)
    {

    }
    //tView.setText("I can come to this room quietly.  is that right? second");该操作不能成功执行 threadHandler.sendEmptyMessage(1);
    }
    }
    public class NewThread extends Thread{
    .
    .
    .
    public NewThread(DrawPicturesActivity context)
    {
    tView = (EditText)context.findViewById(R.id.editText1);
    }
    private Handler threadHandler = new Handler(Looper.myLooper())
    {
    public void handleMessage(Message msg)
    {
    tView.setText("I can come to this room loudly.");
    }
    }; public void run()
    {

    Message msg = threadHandler.obtainMessage();
    try
    {
    Thread.sleep(3000);
    }
    catch (Exception e)
    {

    }
    threadHandler.sendEmptyMessage(1);
    //tView.setText("The second way to this room!");该操作不能成功执行

    }}
      

  12.   

    我在activity中启动了两个线程,在线程中pictureThread中,在延迟等待发生前对UI的操作成功执行,在线程等待之后的操作失败了(被注释了的操作)。nThread的结果和pictureThread差不多。