子執行緒更新ui相關
阿新 • • 發佈:2018-11-07
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(轉)