当前位置: 首页 > news >正文

个人网站 推荐/网站推广软件有哪些

个人网站 推荐,网站推广软件有哪些,网站前台模板免费下载,做网站如何盈利一相信大家都有听过,子线程更新UI的操作。但这种说法,不是很明确。有些人说子线程更新UI会挂,而有些人说子线程可以更新UI。接下来分析下这两种情况。二先来说说子线程更新UI会挂的问题吧。在Activity中onCreate完后,会生成一个Vi…

相信大家都有听过,子线程更新UI的操作。但这种说法,不是很明确。有些人说子线程更新UI会挂,而有些人说子线程可以更新UI。接下来分析下这两种情况。

先来说说子线程更新UI会挂的问题吧。

在Activity中onCreate完后,会生成一个ViewRootImpl,View的绘制都是同个它来实现的,而ViewRootImpl调用到requestLayout()来完成View的绘制操作。看下源码:

//ViewRootImpl.java

@Override

public void requestLayout() {

if (!mHandlingLayoutInLayoutRequest) {

checkThread();

mLayoutRequested = true;

scheduleTraversals();

}

}

但布局绘制或者发生变化时,会调用requestLayout(),而里面有checkThread(),来看下它的源码:

//ViewRootImpl.java

void checkThread() {

if (mThread != Thread.currentThread()) {

throw new CalledFromWrongThreadException(

"Only the original thread that created a view hierarchy can touch its views.");

}

}

其中mThread是在ViewRootImpl创建时初始化的,把创建时的线程和mThread绑定,而ViewRootImpl又是在主线程初始化的,所以mThread表示主线程。假如更新UI,会调用requestLayout() -> checkThread() -> mThread != Thread.currentThread(),判断是否在主线程,如果在子线程中,会抛异常,所以子线程更新UI才会挂。

子线程更新UI会挂的思路明确了,再来看看子线程更新UI为什么不会挂吧。

刚才讲到了,在Activity中onCreate完后,会生成一个ViewRootImpl,那么之后它就会去检查你更新UI时在哪个线程。那假如我在onCreate时去开一个子线程更新UI,此时ViewRootImpl还没创建,就不会去检测UI变化,所以在onCreate中子线程是可以更新UI的。

那又有些人说,我不在onCreate里面更新,我就在onCreate后在子线程里面去更新,它还是不会挂,这又是为什么呢?主要还是看下更新UI的方法吧

text1.setOnClickListener {

thread {

it.post {

text1.text = "change"

}

}

}

这里用一个点击事件,开子线程更新UI,运行后发现没挂,这是为什么?看下post的源码:

//View.java

public boolean post(Runnable action) {

final AttachInfo attachInfo = mAttachInfo;

if (attachInfo != null) {

return attachInfo.mHandler.post(action);

}

通过源码分析,你就知道这个mHandler是在ViewRootImpl里面赋值的,mHandler是主线程的Handler,而又掉了handler.post(),所以只要Handler在主线程,那么它post的所有的UI操作都是主线程。看起来像在子线程,实际是回到主线程更新UI。

继续看这种

class MyTestActivity:AppCompatActivity() {

private val handler = Handler()

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.ab)

}

override fun onResume() {

super.onResume()

getHandler()

}

private fun getHandler(){

thread {

handler.post {

text0.text = "change"

}

}

}

}

由于创建handler时是在主线程,所以这个handler是属于主线程的,所以其他的步骤就更上面的一样了。另一种handler的发消息更新的方式我就不写出来了,只要通过handler更新UI的,只要handler是主线程的,必定不会挂。之前有写过Handler使用的文章,有兴趣的同学可以看看~

还有一种就是调用runOnUiThread{}

class MyTestActivity:AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.ab)

}

override fun onResume() {

super.onResume()

thread()

}

private fun thread(){

thread {

runOnUiThread {

text.text = "change"

}

}

}

}

顾名思义,在主线程运行,只要调了这个方法,所有操作都在主线程里面,所有只要的操作不会挂。

总结一点,并不是说子线程可以更新,仔细点说:子线程中可以在调用主线程的Handler去更新UI,或者子线程可以调用runOnUIThread{}切换到主线程更新UI。

之前还遇到一种特殊情况,在onResume中更新UI不会挂,要是在最后一行加上 view.requestLayout()

@Override

protected void onResume() {

super.onResume();

new Thread() {

@Override

public void run() {

super.run();

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

TextView view = findView(R.id.tv_content);

view.setText("我在子线程更新");

view.setBackgroundColor(Color.RED);

view.requestLayout();

}

}.start();

}

再试一下,就崩了

总结一点:实际上,就是只要你改view,不触发checkThread()就没事,而TextView的宽高不改变,也不会去触发requestLayout(),修改背景也同样。不会触发view的位置大小改变。当然,这种情况,不是每个版本的android都有用,还是要规范的去主线程更新UI。

http://www.lbrq.cn/news/1031635.html

相关文章:

  • 科学城做网站公司/互联网营销师是哪个部门发证
  • 新网站建设方案ppt/平台网站开发公司
  • b2b电子商务网站分类/图片外链生成器
  • 网站的二级页面怎么做代码/中国培训网官网
  • 电子商务网站建设与维护/免费发布信息的平台
  • 网站建设优化及推广/互联网广告推广是什么
  • 网站商城系统建设/桂林seo
  • 国外网站拼邮需要怎么做/广告免费发布信息平台
  • wordpress上传Flickr/seo3的空间构型
  • 中国建设银行联行号查询网站/百度网站流量查询
  • 网站建设功能需求/中国站长素材网
  • 网站怎么建立会员/百度seo是什么意思
  • 网站链接如何做二维码/北京网络营销咨询公司
  • 网站开发实验报告/营销策划与运营团队
  • 杭州市建设工程公示网站/百度上怎么发布信息啊
  • 做网站互联互通/百度人工客服24小时电话
  • 360网站地图怎么做/竞价推广工作内容
  • 无锡 做网站/设计素材网站
  • 网站升级正在升级维护/百度快照推广有效果吗
  • 怎么做免费公司网站/黑帽seo技术有哪些
  • 百度联盟广告点击一次收益/厦门seo百度快照优化
  • 怎么做直播网站的超管/郑州网站建设公司排名
  • 做网站的需求清单/如何制作网页最简单的方法
  • 日照网站开发建设/杭州网络优化公司排名
  • 扬州建设机械网站/如何去推广自己的产品
  • 网站首页设计公司/关键词百度云
  • 为什么要做企业网站/博为峰软件测试培训学费
  • 自己有服务器怎么建设网站/个人博客网页制作
  • 网页设计怎么做网站/网络宣传方式有哪些
  • 百度推广自己做网站/营销策略有哪些有效手段
  • Java Stream API 中常用方法复习及项目实战示例
  • 服务器通过生成公钥和私钥安全登录
  • 《Python学习之基础语法2:掌握程序流程控制的艺术》
  • ERA5---MATLAB处理水汽数据与臭氧数据的读取与重采样-重复性工作
  • Pytest项目_day12(yield、fixture的优先顺序)
  • VMD例程(Matlab 2021b可直接使用)