美文网首页工作生活
多线程编程以及客户端缓存机制、控件的绘制流程和事件分发

多线程编程以及客户端缓存机制、控件的绘制流程和事件分发

作者: 天使飞吧 | 来源:发表于2019-07-01 20:20 被阅读0次

    线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有:

    1)进程之间不能共享数据,线程可以;

    2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小;

    3)Java语言内置了多线程功能支持,简化了java多线程编程。

    线程五个阶段:创建、就绪、运行、阻塞、终止。

    多线程是指在同一程序中有多个顺序流在执行。

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

    实现Runnable接口比继承Thread类所具有的优势:

    1):适合多个相同的程序代码的线程去处理同一个资源

    2):可以避免java中的单继承的限制

    3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

    4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

    Android缓存机制:

    Android缓存分为内存缓存和磁盘缓存。Android 2.3以前,常用的内存缓存方式是软引用(SoftReference)和弱引用(WeakReference)。从Android 2.3(Level 9)开始,垃圾回收器更倾向于回收软引或弱对象,这使得软引用和弱变得不是那么实用有效。同时,到了Android 3.0(Level 11)之后,图片数据Bitmap被放置到了内存的堆区域,而堆区域的内存是由GC管理的,开发者也就不需要进行图片资源的释放工作,但这也使得图片数据的释放无法预知,增加了造成OOM的可能。因此,在Android3.1以后,Android推出了LruCache这个内存缓存类,LruCache中的对象是强引用的。

    LruCache的实现原理:LruCache的核心思想就是要维护一个缓存对象列表LinkedHashMap,LinkedHashMap的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队尾,即将被淘汰。而最近访问的对象将放在队头,最后被淘汰。

    熟悉android控件的绘制流程和事件分发流程

    View是最基本的UI类,几乎所有的控件都继承于View,ViewGroup是View 的子类,可以控制各个子View 的显示层次与位置,同时可以对焦点获取、触摸等交互事件进行处理、拦截或分发。

    视图的绘制主要分为三个步骤,分别为Measure,Layout跟Draw。

    在Measure操作中,ViewGroup通过对子节点进行遍历根据父节点的MeasureSpec以及子节点的LayoutParams等信息计算子节点的宽高,最终整理成父容器的宽高,我们也可以通过重写onMeasure方法来设定。

    紧接着,通过Layout过程,来确定每一个View在父容器中的具体位置,同样的,我们也可以通过onLayout方法来自定义具体的布局流程。

    最后进入Draw的绘制流程,根据前两步所获得的具体布局参数,在draw函数中对各控件进行绘制,绘制的顺序为背景-控件内容-子控件绘制-绘制边缘以及滚动条等装饰物。

    总体来说,控件的绘制都是在控件树上进行的,由ViewGroup分发给子View各自完成自身的测量与布局操作,最后由根节点开始进行绘制,最终形成完整的界面。

      MeasureSpec :一个32位二进制的整数型,前面2位代表的是mode,后面30位代表的是size。mode 主要分为3类,分别是

      EXACTLY:父容器已经测量出子View的大小。对应是 View 的LayoutParams的match_parent 或者精确数值。

      AT_MOST:父容器已经限制子view的大小,View 最终大小不可超过这个值。对应是 View 的LayoutParams的wrap_content

      UNSPECIFIED:父容器不对View有任何限制,要多大给多大,这种情况一般用于系统内部,表示一种测量的状态。

    事件分发:文字描述太多了一张图解决:

    在我们点击屏幕时,会有下列事件发生:Activity调用dispathTouchEvent()方法,把事件传递给Window;Window再将事件交给DecorView(DecorView是View的根布局);DecorView再传递给ViewGroup;Activity ——> Window ——> DecorView ——> ViewGroup——> View事件分发的主要有三个关键方法dispatchTouchEvent() 分发onInterceptTouchEvent() 拦截 ,只有ViewGroup独有此方法onTouchEvent() 处理触摸事件Activity首先调用dispathTouchEvent()进行分发,接着调用super向下传递ViewGroup首先调用dispathTouchEvent()进行分发,接着会调用onInterceptTouchEvent()(拦截事件)。若拦截事件返回为true,表示拦截,事件不会向下层的ViewGroup或者View传递;false,表示不拦截,继续分发事件。默认是false,需要提醒一下,View是没有onInterceptTouchEvent()方法的事件在ViewGroup和ViewGroup、ViewGroup和View之间进行传递,最终到达View;View调用dispathTouchEvent()方法,然后在OnTouchEvent()进行处理事件;OnTouchEvent() 返回true,表示消耗此事件,不再向下传递;返回false,表示不消耗事件,交回上层处理。

    相关文章

      网友评论

        本文标题:多线程编程以及客户端缓存机制、控件的绘制流程和事件分发

        本文链接:https://www.haomeiwen.com/subject/rigncctx.html