xml地图|网站地图|网站标签 [设为首页] [加入收藏]

这可能是Android最经典的面试题,这可能是2017最经

来源:http://www.ccidsi.com 作者:最新解决方案 人气:131 发布时间:2020-03-15
摘要:@Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("lqh", "ViewGroup dispatchTouchEvent"); return super.dispatchTouchEvent; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d("lqh", "ViewGroup onInterc
 @Override public boolean dispatchTouchEvent(MotionEvent ev) { Log.d("lqh", "ViewGroup dispatchTouchEvent"); return super.dispatchTouchEvent; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d("lqh", "ViewGroup onInterceptTouchEvent"); return super.onInterceptTouchEvent; } @Override public boolean onTouchEvent(MotionEvent event) { Log.d("lqh", "ViewGroup onTouchEvent"); return super.onTouchEvent; }

请详细汇报Android事件分发机制:

那道题是数不胜数家面试公司会问到的一道杰出面试题,但又平日被面试者忽视。

看了许多博客也看了好些个代码,超过半数都以意马心猿,不便于阅读固计算如下:

主线传递独有三步:Activity->ViewGroup->View

Activity和View唯有四个点子调节事件传递:dispatchTouchEvent(),onTouchEvent ();ViewGroup有四个章程序调控制传递:dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent ();

接下去用一张图给大家叙述下实际是怎么一步一步分发的。

图片 1总结:1.对于 dispatchTouchEvent,onTouchEvent,return true是终结事件传递。return false 是回溯到父View的onTouch伊夫nt方法。2.ViewGroup 想把温馨分发给和煦的onTouchEvent,要求拦截器onInterceptTouchEvent方法return true 把事件拦截下来。3.ViewGroup 的阻挠器onInterceptTouch伊芙nt 暗中同意是不阻止的,所以return super.onInterceptTouchEvent(State of Qatar=return false;4.View 不曾拦截器,为了让View能够把事件分发给协调的onTouch伊芙nt,View的dispatchTouch伊芙nt暗中认可完结正是把事件分发给自身的onTouchEvent。

ViewGroup和View 的dispatchTouch伊芙nt 是做事件分发,那么那几个事件大概分发出去的几个对象注:------> 前边代表事件目的供给如何是好。1、 本身开销,终结传递。------->return true ;2、 给自个儿的onTouch伊芙nt管理-------> 调用super.dispatchTouchEvent(卡塔尔国系统暗许会去调用 onInterceptTouch伊芙nt,在onInterceptTouchEvent return true就能够去把事件分给本人的onTouchEvent管理。3、 传给子View------>调用super.dispatchTouchEvent(卡塔尔(قطر‎暗中同意达成会去调用 onInterceptTouchEvent 在onInterceptTouchEvent return false,就能把事件传给子类。4、 不传给子View,事件终止往下传递,事件始于回想,从父View的onTouchEvent发轫事件从下到上回归实行种种控件的onTouchEvent------->return false;注: 由于View未有子View所以没有必要onInterceptTouchEvent 来控件是或不是把事件传递给子View依然拦截,所以View的事件分发调用super.dispatchTouchEvent(卡塔尔(قطر‎的时候暗中认可把事件传给本身的onTouch伊夫nt管理,相比较ViewGroup的dispatchTouchEvent 事件分发,View的平地风波分发独有dispatchTouchEvent(State of Qatar和onTouchEvent(卡塔尔没有供给onInterceptTouch伊芙nt(卡塔尔参预。

到那一件事件分发总括收尾。假诺想详细领悟事件分发机制的请看那篇博客:

怎么着判别二个目的是足以被回笼的


    1. 以前java虚构机使用援引计数器的算法,当援引流量计为0时意味着该对象未有援用领会后被清理。不过这一个方法很难解决循环引用难点,所以近日结束使用了。
    1. 脚下采纳的是可达性剖析算法来分明一个指标是或不是足以被回笼。
    1. 原理是:通过叁个叫GC Roots的靶子当做根对象,然后初步向下搜寻,搜索的渠道叫做引用链,当目的到GC Roots未有此外引用链相连的时候,则证明此目的是不可用的.
    1. 不可用对象并非即时就实施回笼措施,推行清理办法从前起码要经验五次标志进度.
  • ①假若对象在张开可达性深入分析后意识并未有与GC Roots相连接的援用链,那它将会被首回标志何况进行叁遍筛选,筛选的基准是此目标是还是不是有必不可缺实践finalize(State of Qatar方法。当对象未有覆盖finalize(卡塔尔(قطر‎方法,也许finalize(卡塔尔国方法已经被设想机调用过,设想机将那二种情景都算得“没有必要实行”。(即意味着一直回笼卡塔尔(قطر‎.

  • ②如若那一个目的被剖断为有必不可缺施行finalize(卡塔尔国方法,那么这么些目的将会停放在三个名叫F-Queue的连串之中,并在稍后由五个由设想机自动建构的、低优先级的Finalizer线程去施行它。这里所谓的“实行”是指虚构机遇接触那个艺术,但并不承诺会等待它运转甘休,那样做的缘由是,即使一个目的在finalize(卡塔尔国方法中推行缓慢,恐怕产生了死循环(更十二万分的图景卡塔尔国,将很可能会促成F-Queue队列中别的对象永久处于等候,以致招致整个内部存款和储蓄器回收连串崩溃.
    1. finalize(卡塔尔方法是目的回笼前的最后壹回机会,稍后GC将对F-Queue中的对象进行第一遍小范围的符号,若是目的要在finalize(卡塔尔(قطر‎中不被回笼,只要重新与援用链上的其他贰个对象创建关系就能够,例如把团结(this关键字State of Qatar赋值给有些类变量可能目的的分子变量,那在其次次标志时它将被移除出“将要回笼”的汇集;若是目的这时还还未有逃脱,这超多它就着实被回笼了。
    1. 其余四个指标的finalize(卡塔尔方法都只会被系统自动调用三次,假如目的面前境遇下贰遍回笼,它的finalize(卡塔尔方法不会被另行实行,因而第二段代码的自救行动曲折了。因为finalize(卡塔尔国方法已经被设想机调用过,虚构机都算得“未有供给试行”。(即意味着一向回笼卡塔尔.

接下去温习一下全方位View树的布局,对各样具体View对象的操作,其实就是个递归的兑现。

2.View的渲染进度,只怕叫View的绘图流程

那道题也是相比老的一道题了,不过无论BAT依旧小创办实业公司中冒出的功效超高接下来就总计性的叙述一遍View绘制流程,防止长篇大论,接下去的描述一切精短盼望各位读者耐性看完,相信您会有极大的获取!View绘图流程是在ViewRoot.java类的performTraversals(卡塔尔(قطر‎函数中开展的绘图部分共计要求三步:

measure() -> layout() -> draw();

1. 判读是或不是再一次总括视图大小

图片 2这里写图片描述

原理:从顶层父View像子View递归调用view.measure(卡塔尔(قطر‎,measure方法中回调onMeasure(卡塔尔国MeasureSpec是View的度量内部类,度量规格为int型,值由高2位规格方式specMode和低叁十五位的具体尺寸specSize组成。

specMode有二种值

MeasureSpec.UPSPECIFIED : 父容器对于子容器未有任何节制,子容器想要多大就多大MeasureSpec.EXACTLY: 父容器已经为子容器设置了尺寸,子容器应当信守这一个边界,无论子容器想要多大的上空。MeasureSpec.AT_MOST:子容器能够是宣称大小内的即兴大小

  • View的measure方法是final,不能重载,只好重载inMeasure实现本人的度量逻辑

  • 顶层的DecorView的MeasureSpec是由ViewRootImpl中的getRootMeasureSpec方法鲜明(LayoutParams宽高级参谋数均为MATCH_PARENT,specMode是EXACTLY,specSize为概略显示屏大小)。

  • ViewGroup类提供了measureChild,measureChild和measureChildWithMargins方法,简化了父子View的尺码计算。

  • 如果是ViewGroup的子类就必须供给LayoutParams世襲子MarginLayoutParams,不然不能利用layout_margin参数。

  • View的布局大小由父View和子View协同决定。

  • 采纳View的getMeasuredWidth(卡塔尔(قطر‎和getMeasuredHeight(卡塔尔(قطر‎方法来得到View测量的宽高,必需确认保证这七个主目的在于onMeasure流程之后被调用才干回去有效值。

2. 是或不是重新分配视图的地点

图片 3这里写图片描述

原理: layout也是从顶层父View向子View的递归调用View.layout方法的长河,父View根据上一步measure子View获得的布局大小和构造参数,将子View放在合适之处上。

  • View.layout方法能够被重载,ViewGroup.layout为final不可能被重载,ViewGroup.onLayout为abstract的子类必得重载实现自身的职分逻辑

  • measure甘休后拿走的是种种View经度量后的measuredWidth和measuredHeight,Layout操作完之后获得的是各类View进行岗位分配后的mLeft,mTop、mRight、mBottom,那个值都以争持父View

  • 凡是layout_XXX的布局属性都以指向性父级View的,假设View未有父级容器则layout_XXX属性是尚未别的意义的

  • 使用View 的getWidth(卡塔尔和getHright(卡塔尔(قطر‎方法取得View度量的宽高非得保证那些章程在在onLayout流程之后。

3. 是或不是再一次绘制

图片 4这边写图片描述

原理: draw进度也是在ViewRootImpl的performTraversals(State of Qatar内部调拨运输的,其调用顺序在measure(State of Qatar和layout(卡塔尔之后,这里的mView对于Actiity来讲正是PhoneWindow.DecorView,ViewRootImpl中的代码会创建多少个Canvas对象,然后调用View的draw(卡塔尔(قطر‎方法来进行实际的绘制工。所以又回归到了ViewGroup与View的树状递归draw进度

  • 假定该View是二个ViewGroup,则须要递归绘制其所包蕴的装有子View。

  • View暗中同意不绘制任何内容,真正的绘图都在和煦的子类中落到实处

  • View的绘图是依靠onDraw(卡塔尔国方法传入的Canvas类来展开的

  • 区分View 动漫和ViewGroup动漫,前者是View自个儿的卡通能够经过setAnimation增多,前者能够透过xml布局的layoutAnimation属性增加

  • 在获得画布剪切区(每一个View的draw中传唱的Canvas)时会自动管理掉padding,子View获得Canvas不用关爱那些逻辑,只关切怎样绘制就可以

  • 私下认可情况下子View的ViewGroup.drawChild绘制顺序和子View被增添的一一一致,可是你也得以重载ViewGroup.getChildDrawingOrder(卡塔尔(قطر‎以提供差异的逐一

4. invalidate()

原理: invalidate方法诉求重绘View树(也正是draw方法),假使View大小未有发生变化就不会调用layout进度,况兼只绘制那多少个“要求重绘的”View,约等于哪位View(View只绘制该View,ViewGroup绘制整个ViewGroup卡塔尔(قطر‎须要invalidate类别措施,就绘制该View。

  • 直接调用invalidate方法.必要重新draw,但只会绘制调用者自己。

  • 触发setSelection方法。央浼重新draw,但只会绘制调用者自身。

  • 触发setVisibility方法。 当View可视状态在INVISIBLE转变VISIBLE时会直接调用invalidate方法,进而绘制该View。当View的可视状态在INVISIBLEVISIBLE 调换为GONE状态时会直接调用requestLayout和invalidate方法,同不平日间由于View树大小爆发了转换,所以会呈请measure进度以至draw进度,同样只绘制须求“重新绘制”的视图。

  • 触发setEnabled方法。乞请重新draw,但不会重复绘制任何View蕴含该调用者本人。

  • 触发requestFocus方法。央求View树的draw进程,只绘制“要求重绘”的View。

例: 当我们写叁个Activity时,大家必定会由此setContentView方法将我们要显得的分界面传入该方法,该方法会讲大家界面通过addView追加到id为content的多个FrameLayout(ViewGroup)中,然后addView方法中通过调运invalidate去公告触发ViewRootImpl类的performTraversals(卡塔尔国方法,至此递归绘制大家自定义的具有构造。

5.requestLayout()

原理: View的requestLayout时其实质正是薄薄升高传递,直到ViewRootImpl截止,然后触发ViewRootImpl的requestLayout方法requestLayout(卡塔尔(قطر‎方法会调用measure进程和layout进程,不会调用draw进程,也不会重新绘制任何View满含该调用者本身。

以上为View渲染的一体化进度,如反常接待指正。

写多少个函数,输入三个数如38,拆分 3 8 = 11,1 1 = 2,最终2不恐怕拆分就回到


    public  int  getNum(int num) {
        while (num >= 10) {
            num = num / 10   num % 10;
        }
        return num;
    }

protected void onLayout(boolean changed, int left, int top, int right, int bottom) { }

请详细描述Android事件分发机制:


那道题是大多家面试公司会问到的一道精髓面试题,但又频频被面试者忽略。

看了多数博客也看了好多代码,大多数都以迟疑不决,不方便人民群众阅读固总计如下:

主线传递唯有三步:Activity->ViewGroup->View

Activity和View只有多少个法子调整事件传递:dispatchTouchEvent(),onTouchEvent ();
ViewGroup有多个点子调控传递:dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent ();

接下去用一张图给大家呈报下实际是怎么一步一步分发的。

总结:
1.对于 dispatchTouchEvent,onTouchEvent,return true是终止事件传递。return false 是回溯到父View的onTouch伊芙nt方法。
2.ViewGroup 想把团结分发给本身的onTouch伊夫nt,须要拦截器onInterceptTouch伊夫nt方法return true 把事件拦截下来。
3.ViewGroup 的阻拦器onInterceptTouchEvent 暗许是不阻止的,所以return super.onInterceptTouchEvent(卡塔尔国=return false;
4.View 还没拦截器,为了让View能够把事件分发给协和的onTouchEvent,View的dispatchTouchEvent暗中认可完成(super)正是把事件分发给和睦的onTouch伊芙nt。

ViewGroup和View 的dispatchTouchEvent 是做事件分发,那么那一个事件或然分发出去的多个指标
注:------> 前边代表事件目的须要咋办。
1、 本人开销,终结传递。------->return true
2、 给协和的onTouch伊芙nt管理-------> 调用super.dispatchTouchEvent(卡塔尔国系统默许会去调用 onInterceptTouchEvent,在onInterceptTouchEvent return true就能去把事件分给本人的onTouchEvent管理。
3、 传给子View------>调用super.dispatchTouch伊芙nt(卡塔尔默许完成会去调用 onInterceptTouch伊芙nt 在onInterceptTouchEvent return false,就能把事件传给子类。
4、 不传给子View,事件终止往下传递,事件开始记念,从父View的onTouchEvent开首事件从下到上回归实践种种控件的onTouch伊夫nt------->return false
注: 由于View未有子View所以没有须求onInterceptTouch伊夫nt 来控件是或不是把事件传递给子View依旧拦截,所以View的事件分发调用super.dispatchTouch伊芙nt(卡塔尔(قطر‎的时候私下认可把事件传给本人的onTouchEvent管理(也正是阻挡),相比ViewGroup的dispatchTouchEvent 事件分发,View的事件分发只有dispatchTouch伊芙nt(卡塔尔和onTouch伊芙nt(State of Qatar不供给onInterceptTouchEvent(State of Qatar到场。

到那事件分发计算收尾。假使想详细摸底事件分发机制的请看那篇博客:
http://blog.csdn.net/w525721508/article/details/78227154


Android中还会有多少个例外的体制,正是当父视图认为子视图给它传递的宽高有卓殊,它会另行央求子视图去实行度量,假诺子视图传递的宽高抢先了父视图的束缚范围,则父视图会使用三个适度的高低,给子视图设置成AT_MOST也许EXACTLY的样式,再度对子视图进行衡量。

View的渲染进度,或许叫View的绘图流程


那道题也是相比较老的一道题了,可是无论BAT照旧小创办实业公司中冒出的效能相当的高
接下去就总括性的描述一次View绘制流程,制止极尽描摹,接下去的描述一切精短
仰望各位读者意志看完,相信您会有十分的大的获得!
View绘图流程是在ViewRoot.java类的performTraversals(State of Qatar函数中张开的
绘图部分共计供给三步:

measure() -> layout() -> draw();

1. 判读是或不是再次总括视图大小(measure)

这里写图片描述

原理:从顶层父View像子View递归调用view.measure(卡塔尔国,measure方法中回调onMeasure(卡塔尔
MeasureSpec是View的衡量内部类,衡量规格为int型,值由高2位规格格局specMode和低三贰拾叁个人的具体尺寸specSize组成。

specMode有三种值

MeasureSpec.UPSPECIFIED : 父容器对于子容器未有任何约束,子容器想要多大就多大
MeasureSpec.EXACTLY: 父容器已经为子容器设置了尺寸,子容器应当听从那些边界,无论子容器想要多大的空中。
MeasureSpec.AT_MOST:子容器能够是宣称大小内的妄动大小

  • View的measure方法是final,不得以重载,只好重载inMeasure实现自个儿的度量逻辑

  • 顶层的DecorView的MeasureSpec是由ViewRootImpl中的getRootMeasureSpec方法鲜明(LayoutParams宽高级参谋数均为MATCH_PARENT,specMode是EXACTLY,specSize为大要荧屏大小)。

  • ViewGroup类提供了measureChild,measureChild和measureChildWithMargins方法,简化了父亲和儿子View的尺寸计算。

  • 假若是ViewGroup的子类就非得供给LayoutParams世襲子MarginLayoutParams,否则不可能利用layout_margin参数。

  • View的布局大小由父View和子View协同决定。

  • 使用View的getMeasuredWidth(卡塔尔(قطر‎和getMeasuredHeight(卡塔尔(قطر‎方法来收获View衡量的宽高,必需确定保证那三个核心在onMeasure流程之后被调用才具回去有效值。

2. 是或不是重新分配视图的岗位(layout)

此间写图片描述

原理: layout也是从顶层父View向子View的递归调用View.layout方法的经过,父View依照上一步measure子View获得的布局大小和结构参数,将子View放在合适的岗位上。

  • View.layout方法能够被重载,ViewGroup.layout为final不能够被重载,ViewGroup.onLayout为abstract的子类必需重载达成和谐的职位逻辑

  • measure停止后取得的是各样View经衡量后的measuredWidth和measuredHeight,Layout操作完今后获得的是各样View进行岗位分配后的mLeft,mTop、mRight、mBottom,那一个值都以争执父View

  • 凡是layout_XXX的布局属性都以照准父级View的,假如View未有父级容器则layout_XXX属性是不曾经担当何意义的

  • 行使View 的getWidth(卡塔尔和getHright(卡塔尔国方法拿到View度量的宽高非得保障那多少个章程在在onLayout流程之后。

3. 是还是不是再一次绘制(draw)

此处写图片描述

原理: draw进度也是在ViewRootImpl的performTraversals(卡塔尔内部调拨运输的,其调用顺序在measure(卡塔尔(قطر‎和layout(卡塔尔之后,这里的mView对于Actiity来讲便是PhoneWindow.DecorView,ViewRootImpl中的代码会成立贰个Canvas对象,然后调用View的draw(卡塔尔方法来执行实际的绘制工。所以又回归到了ViewGroup与View的树状递归draw进度

  • 要是该View是贰个ViewGroup,则必要递归绘制其所含有的持有子View。

  • View私下认可不绘制任何内容,真正的绘图都在友好的子类中贯彻

  • View的绘图是依附onDraw(卡塔尔方法传入的Canvas类来進展的

  • 差距View 动漫和ViewGroup动漫,前面一个是View自己的动漫能够透过setAnimation增加,前面一个能够由此xml构造的layoutAnimation属性增加

  • 在收获画布剪切区(每种View的draw中传播的Canvas)时会自动管理掉padding,子View获得Canvas不用关爱这么些逻辑,只关心什么绘制就可以

  • 默许情况下子View的ViewGroup.drawChild绘制顺序和子View被增添的顺序一致,然则你也得以重载ViewGroup.getChildDrawingOrder(State of Qatar以提供差异的逐条

4. invalidate()

原理: invalidate方法央浼重绘View树(也等于draw方法),纵然View大小未有发生变化就不会调用layout进程,并且只绘制这一个“供给重绘的”View,也等于哪个View(View只绘制该View,ViewGroup绘制整个ViewGroup卡塔尔国需要invalidate连串措施,就绘制该View。

  • 直接调用invalidate方法.诉求重新draw,但只会绘制调用者本身。

  • 触发setSelection方法。乞请重新draw,但只会绘制调用者本人。

  • 触发setVisibility方法。 当View可视状态在INVISIBLE转变VISIBLE时会直接调用invalidate方法,进而绘制该View。当View的可视状态在INVISIBLEVISIBLE 转变为GONE状态时会间接调用requestLayout和invalidate方法,同不平日间鉴于View树大小爆发了改造,所以会呈请measure进度以及draw进程,相符只绘制须要“重新绘制”的视图。

  • 触发setEnabled方法。央求重新draw,但不会另行绘制任何View包含该调用者自个儿。

  • 触发requestFocus方法。央浼View树的draw进度,只绘制“须求重绘”的View。

例: 当大家写三个Activity时,我们终将会通过setContentView方法将大家要显示的分界面传入该办法,该方法会讲大家分界面通过addView追加到id为content的一个FrameLayout(ViewGroup)中,然后addView方法中经过调拨运输invalidate(true卡塔尔国去通告触发ViewRootImpl类的performTraversals(卡塔尔(قطر‎方法,至此递归绘制我们自定义的有所构造。

5.requestLayout()

原理: View的requestLayout时其实质就是稀罕升高传递,直到ViewRootImpl甘休,然后触发ViewRootImpl的requestLayout方法
requestLayout(卡塔尔(قطر‎方法会调用measure进度和layout进度,不会调用draw进程,也不会再一次绘制任何View富含该调用者本身。

如上为View渲染的总体进程,如有毛病招待指正。

我们不修正章程的其他再次回到值,点击view,然后看Log的出口:

运作在主线程的ContentProvider为何不会影响主线程的UI操作?


    1. ContentProvider的onCreate(卡塔尔(قطر‎是运作在UI线程的,而query(卡塔尔(قطر‎,insert(State of Qatar,delete(卡塔尔(قطر‎,update(卡塔尔国是运营在线程池中的职业线程的,所以调用这向个法子并不会卡住ContentProvider所在进度的主线程,但或然会梗塞调用者所在的历程的UI线程!
    1. 据此,调用ContentProvider的操作如故要放在子线程中去做。即便一贯的CRUD的操作是在职业线程的,但系统会让您的调用线程等待那一个异步的操作完成,你本事够接二连三线程早先的做事。

1. dispatchTouchEvent当有监听到事件时,首先由Activity进行捕获,走入事件分发管理流程。(因为activity未有事件拦截,View和ViewGroup有)会将事件传递给最外层View的dispatchTouchEvent(Motion伊夫nt ev卡塔尔方法,该办法对事件开展分发。

四个经过同期调用一个ContentProvider的query获取数据,ContentPrvoider是什么样反应的啊?


  • 分析:
    我们领略Activity那样的机件,它生命周期的回调函数是在UI线程中试行的,ContentProvider的onCreate(卡塔尔方法也是在UI线程中运转的,回答这么些难点前,我们先是要搞清楚ContentProvider的Query(卡塔尔国,insert(卡塔尔,delete(卡塔尔(قطر‎,updata(卡塔尔(قطر‎那多少个法子是不是也是在UI线程中运作。
  • 察觉标题:
    假使以上多少个方法是在UI线程中运作的,那么多个线程并发去调用就很有十分大希望现身AN奔驰G级;即使不是在UI线程运营的,那它是在一个办事线程中运营的依旧在四个线程中运作的呢?即ContentProvider是还是不是扶植并发操作呢?
  • 剖判难点:
    ContentResolver与ContentProvider类掩瞒了得以完成细节,不过ContentProvider所提供的Query(卡塔尔国,insert(卡塔尔,delete(卡塔尔国,updata(卡塔尔这多少个章程都是在ContentProvider举行的线程池中运转的,实际不是在经过的主线程中运作,以为那么些点子有超大希望被多少个地方调用,所以它们是线程安全的。
    ContentProvider落成进度通讯是借助于Binder机制的,所以上述难点会回归到Binder线程管理难题,并非每多个ContentProvider都会有多个线程池,而是三个经过共用一个线程池,共用的线程池正是Binder线程池。
  • 规范答案:
    一个content provider可以担当来自别的三个进程的数量伏乞。即便ContentResolver与ContentProvider类隐敝了完成细节,可是ContentProvider所提供的query(卡塔尔(قطر‎,insert(State of Qatar,delete(State of Qatar,update(卡塔尔都以在ContentProvider进程的线程池中被调用施行的,实际不是经过的主线程中。那个线程池是有Binder成立和爱惜的,其实选用的就是各种应用进度中的Binder线程池。

  1. 直接调用invalidate(State of Qatar方法,伏乞重新draw(State of Qatar,但只会绘制调用者自个儿。
  2. setSelection(State of Qatar方法 :央求重新draw(卡塔尔(قطر‎,但只会绘制调用者自己。
  3. setVisibility(卡塔尔方法 : 当View可视状态在INVISIBLE转变VISIBLE时,会直接调用invalidate(State of Qatar方法,进而绘制该View。
  4. setEnabled(卡塔尔国方法 : 请求重新draw(卡塔尔,但不会再度绘制任何视图包含该调用者本人。

咱俩知道,当Activity接纳到客商的触摸大旨的时候,它就能够被倡议去绘制构造。央浼其实是在android的Framework层去绘制的,它从根节点开头对构造举行衡量和制图。整个View树的绘图流程是在ViewRoot.Java类的performTraversals(State of Qatar函数张开的,该函数做的实行进程可粗略轮廓为:依据早先设置的场馆,推断是或不是需求重新计算视图大小、是还是不是再一次要求布署视图的职分、以致是或不是须要重绘。其框架进度如下:

转发请注明出处

requestLayout()方法 :会招致调用measure(卡塔尔国进程 和 layout(卡塔尔国进度。表明:只是对View树重新构造layout进程包括measure(State of Qatar和layout(卡塔尔进度,不会调用draw(State of Qatar进程,但不会再一次绘制任何视图满含该调用者本人。 常常引起invalidate(State of Qatar操作的函数如下:

synchronized函数和synchronized代码块的分别


    1. 率先synchronized函数和synchronized代码快的意义范围有分别,synchronized函数常常锁定的是现阶段类对象,synchronized代码块锁定功效域能够选拔是本对象,也可以是字符串等等.
    1. 当下类对象锁没有自由的时候,本类的富有synchronized(this卡塔尔(قطر‎同步代码块都不通。倘诺有并发需要synchronized函数,同时只可以有多个号令试行.
    1. 唯独当前类对象锁未有自由的时候,其余央浼能够访谈本类中不带synchronized(this卡塔尔国的代码块,也得以访谈非同一把锁的代码块例如synchronized(StrState of Qatar等.
    1. 出于效果范围有分别,平日意义范围越小实践功效越高,平常花费中貌似选拔效用范围超小的synchronized.

  1. 若果该View是个ViewGroup类型,须求遍历每种子视图chiildView,调用该子视图的layout(卡塔尔国方法去设置它的坐标值。

Android设计ContentProvider的目的是怎么着?


    1. 隐形数据的落实况势,对外提供统一的多寡访谈接口;
    1. 更加好的数码访问权限管理。ContentProvider能够对开荒的数额实行权力设置,差别的UCR-VI能够对应差别的权位,只有契合权限需求的机件技术访谈到ContentProvider的具体操作。
    1. ContentProvider封装了跨进度分享的逻辑,大家只要求Uri就可以访谈数据。由系统来治本ContentProvider的创造、生命周期及拜会的线程分配,简化大家在应用间分享数据(进度间通讯)的诀要。大家只管通过ContentResolver访谈ContentProvider所提醒的数额接口,而没有必要操心它所在过程是开发银行照旧未运行。

  1. 调用onDraw(卡塔尔(قطر‎方法绘制视图本身(各类View都亟需重载该措施,ViewGroup无需达成该格局State of Qatar
  2. 调用dispatchDraw (卡塔尔(قطر‎方法绘制子视图(借使该View类型不为ViewGroup,即不包罗子视图,没有必要重载该方式卡塔尔国,dispatchDraw(卡塔尔方法内部会遍历各样子视图,调用drawChild(卡塔尔(قطر‎去重新回调各类子视图的draw(卡塔尔(قطر‎方法(注意,那一个地点“必要重绘”的视图才会调用draw。值得一表明的是,ViewGroup类已经为我们重写了dispatchDraw(卡塔尔(قطر‎的遵从完毕,应用程序平日没有必要重写该办法,但足以重载父类函数完成具体的效用。

能够看见,ViewGroupA把具有事件都费用了,不再以后头分发事件。同理,大家校订一下ViewGroupB的onInterceptTouchEvent(卡塔尔国方法,Log就能是下面那样:

对onInterceptTouch伊芙nt(State of Qatar有了对应的明白后,那onTouch伊芙nt(卡塔尔其实也是一律的道理,相应的View也许ViewGroup再次回到ture后,事件将不再向上层ViewGroup传递事件,这里就不再撰述了。

再重写ViewGroup中的多个主意

根本成效:为将全部依据子视图的深浅以致布局参数将View树放到合适的义务上。具体的调用链如下: host.layout()开端View树的布局,进而回调给View/ViewGroup类中的layout(卡塔尔方法。具体流程如下

  • return true :表示该View内部消食掉了有着事件。
  • return false :事件在本层不再接续开展分发,并交由上层控件的onTouchEvent方法进行开支(要是本层控件已然是Activity,那么事件将被系统花费或拍卖)。
  • 如若事件分发再次回到系统暗中认可的 super.dispatchTouch伊夫nt,事件将分发给本层的事件拦截onInterceptTouch伊夫nt 方法开展管理。

能够看见ViewGroup类中定义了onLayout那些抽象方法,表达那是个必需被重写的方法。

本文由68399皇家赌场发布于最新解决方案,转载请注明出处:这可能是Android最经典的面试题,这可能是2017最经

关键词: 最经典 Android 面试题 view 攻略

最火资讯