Android知识点总结

Touch事件传递流程:

  • 事件都是从Activity.dispatchTouchEvent()开始传递
  • 事件由父View传递给子View,ViewGroup可以通过onInterceptTouchEvent()方法对事件拦截,停止其向子view传递
  • 如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
  • 如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来,也就是说ACTION_DOWN必须返回true,之后的事件才会传递进来
  • OnTouchListener优先于onTouchEvent()对事件进行消费

Android源码设计模式
Android源码设计模式

单例模式
作者:Mr.Simple

Builder模式
作者:Mr.Simple

外观模式
作者:elsdnwnMr.Simple

模板方法
作者:Mr.Simple

适配器模式
作者:Mr.Simple

观察者模式
作者:Mr.Simple

策略模式
作者:GKerison

代理模式
作者:singwhatiwanna

迭代器模式
作者:Haoxiqiang

责任链模式
作者:AigeStudio

命令模式
作者:lijunhuayc

桥接模式
作者:shen0834

原型模式
作者:Mr.Simple

多线程:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable),View.postDelay(Runnable,long)
  • Handler
  • AsyncTask

线程同步问题
解决同步问题的方法 使用synchronized方法 同步代码块
Android线程间交互(Java synchronized & Android Handler)
单例

public class Singleton{
     private volatile static Singleton mSingleton;
         private Singleton(){
     }
     public static Singleton getInstance(){
         if(mSingleton == null){\\A
             synchronized(Singleton.class){\\C
                   if(mSingleton == null)
                   mSingleton = new Singleton();\\B
            }
         }
        return mSingleton;
     }
}

什么情况导致oom
Android内存优化之OOM
什么情况导致内存泄漏-美团

优化自定义view百度
优化自定义view百度-乐视-小米

RxJava的机制是什么
RxJava是使用的Java语言,以响应式编程思维来进行编程的Java类库。

ButterKnife的机制是什么
Java Annotation Processing技术,在Java代码编译Java字节码的时候,已经处理了@Bind、@OnClick (ButterKnife还支持很多其他的注解)这些注解。

Annotation processing 是javac中用于编译时扫描和解析Java注解的工具。Annotation processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码。新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法。

Android开发常用的网络请求框架:OkHttp、Volley、XUtils、Retrofit对比

  • 1.XUtils
    此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以View注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块处问题了,这个影响非常大,所以在项目开发时,一般会更喜欢选择专注某一个领域的框架。
  • 2.OkHttp
    Android开发中是可以直接使用现成的api进行网络请求的,就是使用HttpClient,HttpUrlConnection进行操作,目前HttpClient已经被废弃,而android-async-http是基于HttpClient的,可能也是因为这个原因作者放弃了维护。而OkHttp是Square公司开源的针对Java和Android程序,封装的一个高性能http请求库,它的职责跟HttpUrlConnection是一样的,支持spdy,http2.0,websocket,支持同步,异步,而且OkHttp又封装了线程池,封装了数据转换,封装了参数使用、错误处理等,api使用起来更加方便。可以把它理解成是一个封装之后的类似HttpUrlConnection的东西,但是在使用的时候,仍然需要自己再做一层的封装,这样才能像使用一个框架一样的更加顺手。
  • 3.Volley
    Volley是Google官方出的一套小而精巧的异步请求库,该框架封装的扩展性很强,支持HttpClient、HttpUrlConnection,甚至支持OkHttp,而且Volley里面也封装了ImageLoader,所以如果你愿意,你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,稍复杂点的需求还是需要使用专门的图片加载框架。Volley也有缺陷,比如不支持post大数据,所以不适合上传文件。不过Volley设计的初衷本身也就是为频繁的、数据量小的网络请求而生的。
  • 4.Retrofit
    Retrofit是Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架,RESTful是目前流行的一套api设计风格,并不是标准。Retrofit的封装可以说是很强大,里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然默认是用http,可以使用不同的Json Converter来序列化数据,同时提供对RxJava的支持,使用Retrofit+OkHttp+Dagger2可以说是目前比较流行的一套框架,但是需要有较高的门槛。
  • 5.Volley VS OkHttp
    Volley的优势在于封装的更好,而使用OkHttp你需要有足够的能力再进行一次封装。而OkHttp的优势在于性能更高,因为OkHttp基于NIO和OKio,所以性能上要比Volley更快。IO和NIO这两个都是Java中的概念,如果我从硬盘读取数据,第一种方式就是程序一直等,数据读完后,才能继续操作这种是最简单的也叫阻塞式IO,还有一种是你读你的,程序接着往下执行,等数据处理完你再来通知我,然后再处理回调。而第二种就是NIO得方式,非阻塞式,所以NIO当然要比IO的性能要好了,儿OKio是Square公司基于IO和NIO基础上做的一个更简单、高效处理数据流的一个库。理论上如果Volley和OkHttp对比的话,更倾向于使用Volley,因为Volley内部同样支持使用Okhttp,这点OkHttp的性能优势就没了,而且Volley本身封装的也更易用,扩展性更好些。
  • 6.OkHttp VS Retrofit
    毫无疑问,Retrofit 默认是基于 OkHttp 而做的封装,这点来说没有可比性,肯定首选 Retrofit。
  • 7.Volley VS Retrofit
    这两个库都做了不错的封装,但Retrofit解耦的更彻底,尤其Retrofit2.0出来,Jake对之前1.0设计不合理的地方做了大量重构, 职责更细分,而且Retrofit默认使用OkHttp,性能上也要比Volley占优势,再有如果你的项目如果采用了RxJava ,那更该使用 Retrofit 。所以这两个库相比,Retrofit更有优势,在能掌握两个框架的前提下该优先使用 Retrofit。但是Retrofit门槛要比Volley稍高些, 要理解他的原理,各种用法,想彻底搞明白还是需要花些功夫的,如果你对它一知半解,那还是建议在商业项目使用Volley吧。

总结
综上,如果以上三种网络库你都能熟练掌握,那么优先推荐使用Retrofit,前提是最好你们的后台api也能遵循RESTful的风格, 其次如果不想使用或者没能力掌握Retrofit ,那么推荐使用Volley ,毕竟Volley不需要做过多的封装,如果需要上传大数据, 那么不建议使用 Volley,该采用 OkHttp

String、StringBuffer与StringBuilder的区别

  • String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象
  • StringBuffer和StringBuilder的底层是char[]数组实现的
  • StringBuilder是线程安全的,而StringBuilder是线程不安全的

Java的四种引用的区别

  • 强引用:如果一个对象具有强引用,他就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会 回收它,而是抛出OutOfMemoryError错误,是程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
  • 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。
  • 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当JVM进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。
  • 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可以被垃圾回收器回收。

请介绍AsyncTask的内部实现,适用的场景是

  • AsyncTask内部也是Handler机制来完成的,只不过Android提供了执行框架来提供线程池来
  • 执行相应地任务,因为线程池的大小问题,所以AsyncTask只应该来执行耗时时间较短的任务。
  • 比如HTTP请求,大规模的下载和数据库的更改不适用于AsyncTask,因为会导致线程池堵塞,没有
  • 线程来执行其他的任务,导致的情形是会发生AsyncTask根本执行不了的问题。

请解释什么叫TCP和UDP

  • TCP叫传输控制协议,它是一种可靠的连接,即有服务器和客户端,只有当双方建立好连接后,才能互相发送数据。(TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。)
  • UDP叫用户数据报协议,它是一种不可靠的连接,即发送发在没有建立好连接的情况下,就可以直接向目标主机发送数据。(UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。)

推荐阅读更多精彩内容