Handler,线程

来源:互联网 发布:淘宝小女孩泳衣模特 编辑:程序博客网 时间:2024/04/29 13:10

1. Handler与UI同线程,它用于在子线程中通知主线程更新。

     诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的Message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。
      例如,在子线程的状态发生变化时,我们需要更新UI。如果在子线程中直接更新UI,通常会抛出下面的异常:

ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.意思是,无法在子线程中更新UI。

      为此,需要通过Handler通知主线程Ui Thread来更新界面。

 

2.  在Android的开发中,非UI线程不能操作UI线程中的控件,即UI是非线程安全的;

     如调用setBackGround(int color)或者setVisibility(int v)时,程序运行后出现异常,但是在工作线程(非UI线程)中调用android.widget.ProgressBar控件的setProgress(int count)方法时,程序运行并不会出现异常,

    在大多数应用程序中,我们通常会有一个UI线程,即Android的UI Looper线程,还有一个通讯线程,负责和服务器端的交互。因为ProgressBar控件属于非UI线程的变量,它为非UI线程所有,不存在多线程共享数据的问题;而在非UI线程中调用setBackGround(int color)等方法,就涉及到调用UI线程的Context等变量的问题,这样就存在线程安全的隐患。

    参考    http://blog.csdn.net/dongfengsun/article/details/753069