1、发生Android.view.ViewRoot$CalledFromWrongThreadException异常:

诞生一个主线程的Handler的物件,当做Listener去让子线程能够将讯息Push到主线程的message Quene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。

创建一个Handler对象, @Override中handleMessage

   
   
   
   
  1. public final static int GET_FROM_BACKEND_SUCCESS = 1; 
  2. public final static int GET_FROM_BACKEND_FAILED = -1; 
   
   
   
   
  1. private Handler getDataHandler = new Handler(){ 
  2.         /* (non-Javadoc) 
  3.          * @see android.os.Handler#handleMessage(android.os.Message) 
  4.          */ 
  5.         @Override 
  6.         public void handleMessage(Message msg) { 
  7.             // TODO Auto-generated method stub 
  8.             super.handleMessage(msg); 
  9.             int id = msg.what; 
  10.             switch(id){ 
  11.             case GET_FAVORITE_LIST_FROM_BACKEND_SUCCESS: 
  12.                 
  13.                 break
  14.             case GET_FAVORITE_LIST_FROM_BACKEND_FAILED: 
  15.                 
  16.                 break
  17.             } 
  18.             ....setVisibility(View.GONE); 
  19.         } 
  20.     }; 
  21.     private Runnable runnable = new Runnable(){ 
  22.         @Override 
  23.         public void run() { 
  24.             try { 
  25.                ...........
  26.                 getDataHandler.sendEmptyMessage(GET_FROM_BACKEND_SUCCESS); 
  27.             } catch (Exception e) { 
  28.                 // TODO Auto-generated catch block 
  29.                 e.printStackTrace(); 
  30.                 getDataHandler.sendEmptyMessage(GET_FROM_BACKEND_FAILED); 
  31.             } 
  32.         } 
  33.     }; 
  34.     private Thread getDataThread; 

   
   
   
   
  1. if(!msalApp.haveAvaliableNetWork()){ 
  2.             Toast.makeText(this, R.string.no_internet, Toast.LENGTH_SHORT).show(); 
  3.         }else
  4.             ....setVisibility(View.VISIBLE); 
  5.             getDataThread = new Thread(runnable); 
  6.             getDataThread.setPriority(Thread.NORM_PRIORITY); 
  7.             getDataThread.start(); 
  8.         } 
  9. }