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在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 1.Android系统的架构 1.Android系统架构之应用程序 Android会同一系列核心应用程序包一起发布...
    QM阅读 2,005评论 0 50
  • 直到飞机降落在慕尼黑,我还是一句德语都不会的。连个简单打招呼都没学。外派德国3个月的决定是在出国前两周定下的,出国...
    草木一枝丫阅读 244评论 0 1
  • 人总要有一个行动的起点
    自在意阅读 168评论 0 0