旅游网站模板库,古典风网站,校园网站建设详细的设计方案,网站开发中需要解决的技术问题一些问题
子线程可以更新 UI 吗
答案是可以的#xff0c;在特定的情况下可以
可以先在主线程中调用requestLayout() 方法#xff0c;然后紧接着在子线程中更新UI#xff08;原理#xff1a;不要在子线程触发 checkThread() 方法#xff0c;而checkThread() 方法的调用时…一些问题
子线程可以更新 UI 吗
答案是可以的在特定的情况下可以
可以先在主线程中调用requestLayout() 方法然后紧接着在子线程中更新UI原理不要在子线程触发 checkThread() 方法而checkThread() 方法的调用时机是在requestLayout() 方法中checkThread判断规则是判断调用线程是不是我所在的线程不出意外的话我所在的线程是主线程在子线程中创建ViewRootIml原理ViewRootIml最初创建的是哪个线程之后就可以必须一直在这个线程中更新UI默认是主线程创建因为他所在线程是子线程直接运行会报错因为子线程没有looper需要Looper.prepare(); 之后就可以在这个子线程当中一直更新UI了再换一个子线程也不行主线程更新UI也会报错 Looper.loop();view的宽高为固定宽高也可以进行更新因为在checkForRelayout() 方法中会宽高是否是matchParent或者固定值如果是就不需要请求重新布局或者高不是固定值重绘后高度不会发生改变直接重绘就行了关闭硬件加速就不行了绘制是不检查线程的使用SurfaceView可以在子线程中更新UI
子线程吐司
报错不能在一个没有Looper.prepare()的线程中吐司同样的道理 Looper.prepare() Toast.show(“aaa”) Looper.loop() 也可以进行吐司
View绘制完成的宽度在哪个时刻能一定拿到Activity的onStartonResumeview.post { } ?
都不是最好的是viewTree.observ
Window是个抽象类他的实现类有哪些
Window 只有一个实现类PhoneWindow
布局通过setContentView传给Activity他们是怎么结合到一起的
Activity调用Window的setContentViewPhoneWindow会关联DecorViewDecorView会匹配系统内置布局文件默认的是ActionBarFramLayout那个布局FramLayout的id是content然后将我们传入的布局文件add进FramLayout
Activity在使用的过程中从来没有new的操作他是怎么来的
ActivityThread创建Activity的生命周期的调用也是他在不同时机进行的比如 handleLancherActivity会创建当前Activity调用Activity的attach、onCreat
总结
子线程不是不能更新UI而是谷歌工程师不让我们在子线程更新UI是一种代码级别的约定因为如果任意线程都能更新UI那么系统工程师就需要做线程安全每次更新UI都得执行加锁、解锁操作浪费性能还得考虑各种意外情况
出于成本考虑强制让开发者在主线程更新UI能解决掉非常大的性能问题和巨量的工作所以说不允许在子线程更新UI