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(转)