1. 程式人生 > >子執行緒更新ui相關

子執行緒更新ui相關

1.Android載入view有兩種方式:一是setContentView,二是inflater.inflate()

2.子執行緒其實是可以更新ui的,需要viewRoot,ViewRoot本質是一個Handler,作用是建立View與WindowsManger的通訊。通過Windowmanager的addView可以建立viewRoot,而activity在onresume中去addView,從而建立viewRoot。所以此時會出現極端情況,oncreat中建立執行緒,並在執行緒中更新UI,如果執行緒耗時極短,viewRoot還沒建立好,那麼此時子執行緒更新UI並不會出錯。

3.子執行緒直接更新ui出現異常:只有建立了這個view的thread才能操縱這個view

4.子執行緒通過WindowManager直接更新ui,即在子執行緒中用WindowManager.add()展示了view

異常:Can't create handler inside thread that has not called Looper.prepare().說明建立ViewRoot但是沒有looper

5.子執行緒中其實也可以更新UI

class NonUiThread extends Thread{ 

   @Override 
   public void run() { 

   Looper.prepare(); 

   TextView tx = new TextView(MainActivity.this);
   tx.setText("non-UiThread update textview"); 
   
   WindowManager windowManager = MainActivity.this.getWindowManager(); 
   WindowManager.LayoutParams params =new WindowManager.LayoutParams(200,200,200,200,
   WindowManager.LayoutParams.FIRST_SUB_WINDOW,          
   WindowManager.LayoutParams.TYPE_TOAST,PixelFormat.OPAQUE); 

   windowManager.addView(tx, params); Looper.loop();
                    } 
}

參考:

https://www.cnblogs.com/xuyinhuan/p/5930287.html(轉)