子线程更新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(转)

猜你喜欢

转载自blog.csdn.net/qq_37321098/article/details/81736324
今日推荐