171103 阅读技巧——碎片阅读法

一 、如何更好明白原作:

转发请注脚出处

翻阅时的通过:读,嗯,这些有道理。嗯那个笔者清楚。哦哦这里是在说什么样啊,然后大约提取一下。仿佛此反思部分1回读完。飘忽不定(只怕是效用管理,精力管理、时间管理)。读书方法不对?


措施:1.写——如何冥想带来生活的令人瞩目。别的时间也有近似场馆,会蓦然思绪飘走。

synchronized函数和synchronized代码块的不相同


    1. 率先synchronized函数和synchronized代码快的效果范围有分别,synchronized函数一般锁定的是当下类对象,synchronized代码块锁定效用域能够选取是本对象,也足以是字符串等等.
    1. 此时此刻类对象锁没有自由的时候,本类的拥有synchronized(this)同步代码块都过不去。如若有并发请求synchronized函数,同一时间只可以有八个呼吁执行
      .
    1. 可是方今类对象锁没有自由的时候,别的请求可以访问本类中不带synchronized(this)的代码块,也足以访问非同一把锁的代码块例如synchronized(Str)等.
    1. 出于效果范围有分别,一般意义范围越小执行效用越高,常常开支中一般选择效用范围较小的synchronized.

2.总括那段说的怎么着,和上段什么关系,在那部分中是什么身份。——精通能力

如何判断三个对象是能够被回收的


    1. 事先java虚拟机使用引用计数器的算法,当引用计数器为0时表示该对象没有引用掌握后被清理。不过那么些方法很难化解循环引用难点,所以近期甘休使用了。
    1. 日前利用的是可达性分析算法来显著三个目的是否能够被回收。
    1. 规律是:通过多个叫GC
      Roots的对象当作根对象,然后起始向下寻找,搜索的门道叫做引用链,当目的到GC
      Roots没有别的引用链相连的时候,则印证此目的是不可用的.
    1. 不可用对象并不是马上就实施回收措施,执行清理办法以前至少要经历三遍标记进程.
  • ①要是对象在举行可达性分析后意识并未与GC
    Roots相连接的引用链,那它将会被第三遍标记并且开展三回筛选,筛选的原则是此目的是否有须求履行finalize()方法。当目的没有覆盖finalize()方法,大概finalize()方法已经被虚拟机调用过,虚拟机将那二种意况都说是“没有必要履行”。(即表示一贯回收).

  • ②假诺那一个指标被判定为有供给履行finalize()方法,那么那一个指标将会停放在二个名为F-Queue的行列之中,并在稍后由三个由虚拟机自动建立的、低优先级的Finalizer线程去实践它。这里所谓的“执行”是指虚拟机会接触那么些法子,但并不承诺会等待它运转甘休,那样做的原因是,假如3个目的在finalize()方法中执行缓慢,可能爆发了死循环(更极端的情形),将很大概会招致F-Queue队列中任何对象永久处于等候,甚至造成整个内存回收种类崩溃.
    1. finalize()方法是目的回收前的末尾三遍机遇,稍后GC将对F-Queue中的对象开始展览第一次小圈圈的标志,假诺指标要在finalize()中不被回收,只要重新与引用链上的其它3个对象建立关联即可,譬如把温馨(this关键字)赋值给某些类变量大概目的的成员变量,那在其次次标记时它将被移除出“即将回收”的集合;假若指标那时候还未曾回避,这大多它就真正被回收了。
    1. 其余三个对象的finalize()方法都只会被系统活动调用贰回,假若指标面临下2回回收,它的finalize()方法不会被重新实施,因而第②段代码的自救行动失利了。因为finalize()方法已经被虚拟机调用过,虚拟机都说是“没有须求履行”。(即表示一向回收).

3.恐怕先看标题,建立框架。然后填入

写三个函数,输入3个数如38,拆分 3 + 8 = 11,1 + 1 = 2,最终2不能够拆分就重返


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

前些天阅读时意识了难点,并且提议了二个点子。

多少个进程同时调用三个ContentProvider的query获取数据,ContentPrvoider是哪些影响的啊?


  • 分析:
    咱俩掌握Activity那样的机件,它生命周期的回调函数是在UI线程中执行的,ContentProvider的onCreate()方法也是在UI线程中运转的,回答这一个难点前,我们先是要搞清楚ContentProvider的Query(),insert(),delete(),updata()那多少个艺术是或不是也是在UI线程中运作。
  • 察觉标题:
    若是以上多少个措施是在UI线程中运转的,那么三个线程并发去调用就很有大概现身AN路虎极光;尽管不是在UI线程运转的,那它是在二个行事线程中运作的依旧在四个线程中运维的吗?即ContentProvider是还是不是帮助并发操作呢?
  • 分析难题:
    ContentResolver与ContentProvider类隐藏了实现细节,但是ContentProvider所提供的Query(),insert(),delete(),updata()那几个办法都是在ContentProvider举行的线程池中运作的,而不是在经过的主线程中运转,以为那一个点子有恐怕被七个地点调用,所以它们是线程安全的。
    ContentProvider完结进度通讯是凭借于Binder机制的,所以上述难点会回归到Binder线程处理难点,并不是每一个ContentProvider都会有三个线程池,而是三个进度共用一个线程池,共用的线程池便是Binder线程池。
  • 标准答案:
    2个content
    provider能够承受来自别的贰个经过的数据请求。即使ContentResolver与ContentProvider类隐藏了落到实处细节,可是ContentProvider所提供的query(),insert(),delete(),update()都以在ContentProvider进程的线程池中被调用执行的,而不是进程的主线程中。这些线程池是有Binder创立和保安的,其实采纳的就是各种应用进度中的Binder线程池。

前些天读了《怎样用好碎片化时间,让思维更有功效?》,才发觉笔者的难题混淆了翻阅和看书几个概念。读正是眼睛扫过了,并未处理加工;看书是领略联系应用。

Android设计ContentProvider的指标是哪些?


    1. 潜伏数据的兑现格局,对外提供统一的数码访问接口;
    1. 更好的数据访问权限管理。ContentProvider可以对开发的数量开始展览权力设置,不相同的U途乐I能够对应分裂的权限,唯有顺应权限须求的零件才能访问到ContentProvider的具体操作。
    1. ContentProvider封装了跨进度共享的逻辑,大家只必要Uri即可访问数据。由系统来保管ContentProvider的始建、生命周期及走访的线程分配,简化我们在动用间共享数据(进度间通讯)的章程。我们即便通过ContentResolver访问ContentProvider所提醒的多寡接口,而不须要担心它所在进程是运营照旧未运转。

那怎么知道联系应用呢,便是比如说在《观呼吸》看到“正念只是个当先的号子”那句话,就想一想啊那是说“正念”只是大家概念化了,可是精神是怎样前面会说。再比如说,联系。联系有文内联系,那句话和眼下哪句话关联呢,这段和哪段关联呢。还足以调换已经有的经验。L先生说中,看书分成七个阶段,驾驭和加工。联系到RAV4IA的拆书法则,是或不是I正是精晓吧,A正是加工呢。再比如动用,那些就是改变生活的有史以来了,分外关键了。L先生驷马难追说了那几个内容。

运作在主线程的ContentProvider为啥不会潜移默化主线程的UI操作?


    1. ContentProvider的onCreate()是运营在UI线程的,而query(),insert(),delete(),update()是运作在线程池中的工作线程的,所以调用那向个法子并不会卡住ContentProvider所在进度的主线程,但也许会卡住调用者所在的历程的UI线程!
    1. 据此,调用ContentProvider的操作依旧要放在子线程中去做。纵然向来的CRUD的操作是在干活线程的,但系统会让您的调用线程等待这几个异步的操作完毕,你才足以延续线程在此之前的办事。

席卷来说,就是新知识联系旧的阅历知识等就是加工。大家领到提取的广度、数量越来越多,连接的更多,那么回忆的就越深。

请详细描述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 的掣肘器onInterceptTouch伊夫nt 默许是不阻拦的,所以return
super.onInterceptTouch伊芙nt()=return false;
4.View
并未拦截器,为了让View能够把事件分发给协调的onTouch伊夫nt,View的dispatchTouch伊芙nt暗许实现(super)正是把事件分发给协调的onTouch伊夫nt。

ViewGroup和View 的dispatchTouch伊芙nt
是做事件分发,那么那一个事件恐怕分发出去的多少个对象
注:——> 前面代表事件目的需求怎么办。
壹 、 本身开支,终结传递。——->return true
2、 给本身的onTouch伊夫nt处理——->
调用super.dispatchTouch伊芙nt()系统暗许会去调用
onInterceptTouchEvent,在onInterceptTouch伊芙nt return
true就会去把事件分给自个儿的onTouch伊芙nt处理。
③ 、 传给子View——>调用super.dispatchTouch伊夫nt()暗中同意完成会去调用
onInterceptTouch伊夫nt 在onInterceptTouch伊芙nt return
false,就会把事件传给子类。
4、不传给子View,事件终止往下传递,事件开始回想,从父View的onTouch伊芙nt伊始事件从下到上回归执行各种控件的onTouchEvent——->return
false

注: 由于View没有子View所以不要求onInterceptTouch伊夫nt
来控件是或不是把事件传递给子View依然拦截,所以View的事件分发调用super.dispatchTouch伊夫nt()的时候暗许把事件传给本人的onTouch伊夫nt处理(也正是阻挡),相比ViewGroup的dispatchTouch伊夫nt
事件分发,View的轩然大波分发唯有dispatchTouch伊夫nt()和onTouch伊芙nt()不需求onInterceptTouch伊夫nt()参与。

到此事件分发总计收尾。假若想详细询问事件分发机制的请看那篇博客:
http://blog.csdn.net/w525721508/article/details/78227154


诸如此类也正是说,笔者一旦深刻加工那么就会专注而且确实记住,并且想得会深入些。

View的渲染进程,大概叫View的绘图流程


那道题也是比较老的一道题了,不过无论BAT仍旧小创业公司中冒出的效用非凡高
接下去就总括性的讲述三次View绘制流程,幸免大书特书,接下去的讲述一切从简
指望各位读者耐心看完,相信您会有非常的大的取得!
View绘图流程是在ViewRoot.java类的performTraversals()函数中展开的
绘图部分共计需求三步:

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

1. 判读是或不是再度计算视图大小(measure)

此间写图片描述

原理:从顶层父View像子View递归调用view.measure(),measure方法中回调onMeasure()
MeasureSpec是View的度量内部类,衡量规格为int型,值由高四位规格方式specMode和低30个人的具体尺寸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是1个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的可视状态在INVISIBLE\VISIBLE
    转换为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渲染的完整进度,如有难题欢迎指正。

那么具体如何是好吧?

A.首先记录难题

1.那段讲的是怎么,基本概念是怎么。

2.查找底层原理和法则。为啥是这么呢,别的的有没有相近的。

3.挂钩前文新闻,联系别的知识点,联系过往经验。(八个)

4.还有何地点可以运用(几个)

5.下一步如何做。

B.碎片思考

等到上下班通勤或许碎片化的时刻就足以打开那个难题清单,每一个实行思考了。

步骤为如下几步

1)T(target)我今后要消除的是哪些难点。

2)E(expland)小编能想多有点与之荣辱与共的音讯。(发散思维)

3)C(contact)哪些新闻方可更进一步深切应用。

C.运行发散思维

怎么样开始展览分流思维,正是放松,方法有二1.30秒书写此刻心里活动,有点像正念书面化了。2.以呼吸为禅修对象的苦思苦想几秒。

时间为1-3-1比例,共计5min。

三月8号笔者又拓展了增加补充,针对于知识精晓一些的,联系其他书籍,从学别人的模型到树立和谐的模子,最终得以逐步建立协调的知识系统。详细请见171108读书技巧——碎片阅读法的落到实处 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注