美文网首页
Java基础知识整理4——Android篇2

Java基础知识整理4——Android篇2

作者: Looofter | 来源:发表于2017-05-15 13:30 被阅读0次

    一、为什么会出现ANR,如何避免ANR

    出现的原因有三种:

            1.KeyDispatchTimeout(5 seconds)主要类型按键或触摸事件在特定时间内无响应。

            2.BroadcastTimeout(10 seconds)BoradcastReceiver在特定的时间内无法处理。

            3.ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成。

    避免ANR最核心的一点就是在主线程减少耗时操作。通常需要从那个以下几个方案下手:

            1.使用子线程处理耗时IO操作。

            2.降低子线程优先级,使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。

            3.使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。

            4.Activity的onCreate和onResume回调中尽量避免耗时的代码。

            5.BroadcastReceiver中onReceiver代码也要尽量减少耗时操作,建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题。

    二、什么是三级缓存?三级缓存的原理

            1.网络加载,不优先加载,速度慢,浪费流量。

            2.本地缓存,次优先加载,速度快。

            3.内存缓存,优先加载,速度最快。

            首次加载Android App时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中,之后运行APP时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中图片,最后选择访问网络。

    三、ListView卡顿的原因以及优化策略

            1.重用converView。

            2.减少findViewById()操作。

            3.避免在getView()方法中做耗时的操作。

            4.item的布局层次结构尽量简单,避免布局太深或者不必要的重绘。

            5.尽量能保证Adapter的hasStablelds()返回true。

            6.在一些场景中,ScollView内会包含多个ListView,可以把ListView的高度写死固定下来。

            7.使用RecycleView代替ListView。

            8.ListView中元素避免半透明。

            9.尽量开启硬件加速。

    四、View的绘制过程

            一个View要显示在界面上,需要经历一个 View树的遍历过程,这个过程又可以分为三个过程,也就是自定义View中的三要素:大小,位置,画什么,即onMesure() , onLayout() , onDraw()

            1.onMesure()确定一个View的大小

            2.onLayout()确定View在父节点上的位置

            3.onDraw()绘制View的内容

    五、简述AIDL机制

            AIDL(Android Interface Definition Language),Android 接口定义语言,Android 提供的IPC(InterProcess Communication,进程间通信)的一种独特实现。

            使用AIDL只有在你允许来自不同应用的客户端夸进程通信访问你的service,并且想要在你的service中处理多线程的时候才时必要的。如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口:

            1.建立.aidl文件。

            2.实现这个接口。

            3.暴露这个接口给客户端。

    六、简述android事件分发机制

            android事件分发机制就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程。如下:

            1.事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或者拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

            2.事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

            3.如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。

            4.如果View没有对ACTION_DOEN进行消费,之后其他的事件不会传递过来。

            5.onTouchListener优先于onTouchEvent()对事件进行消费。

    七、简述Handler机制

             Handler的作用就是:调度消息和runnable对象去被执行;使动作在不同的线程中被执行。

             Handler机制上android中异步消息处理机制,也就是异步消息处理线程启动后会进入一个无限循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。

            而它们之间的关系是,消息循环Looper负责创建一个消息队列MessageQueue,而消息队列MessageQueue是消息Message的容器,也是装消息Message的地方,然后进入一个无限循环体不断从该消息队列MessageQueue中读取消息,而消息的创建者和处理者就是一个或多个Handler。

    相关文章

      网友评论

          本文标题:Java基础知识整理4——Android篇2

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