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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值