转载请注明出处: http://blog.csdn.net/iwanghang/
我正在参加CSDN 2016博客之星评选,希望得到您的宝贵一票~
http://blog.csdn.net/vote/candidate.html?username=iwanghang
请为我投票,谢谢 ~~
如果没有CSDN账号 直接使用微信/QQ/微博登陆 就能投票了~~
整理这些概念的期间,强迫自己大量阅读了别人的博客,是一个难得的过程。虽然,一些内容,很难在专业、浅显易懂与篇幅 这三者上做取舍,但是,我觉得这样四篇基础概念博文,还是可以给大家带来一丢丢的帮助的。错漏之处,劳烦指正。
59.Android 图片异步加载。
1、采用多线程。将耗时的操作放在子线程中待其拿到数据后发一条消息到主线程中,从而在主线程中进行更新显示。
2、AsyncTask。异步线程加载图片。进行耗时操作比如加载图片要求不要阻塞UI线程,就必须使用异步任务。AsyncTask是不需要借助thread+handler即可实现异步任务的组件,使用起来比较简单且更轻量级一些。
3、LruCache。缓存已经加载过的图片。
60.Android 缓存策略。
缓存管理方法是数据库和文件,通常保存到sdcard。数据库如(SQLite)缓存方式。文件如.txt。
必须要说的是,LruCache、DiskLruCache。LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。
介绍一下三级缓存,内存缓存(从内存中获取图片显示)、本地缓存(内存中没有从sd卡获取)、网络缓存(从网络下载并保存入本地和内存)
附上郭神相关博文链接: http://blog.csdn.net/guolin_blog/article/details/28863651
61.Android 线程池。
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
不需要处理的时候可以将它shutdow掉,同时当我们定义了一个线程池之后,可以复用线程而不需要开启更多线程,这点对于我们手机开发是至关重要的,你开启的thread越多意味着你的app内存消耗越多,速度也就越来越慢,提高现有线程的复用很有必要。
线程池的好处:
1、复用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。
2、能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。
3、能对线程进行简单的管理。并提供定时执行以及指定间隔循环执行等功能。
线程池包括:newCachedThreadPool()缓存型线程池、newFixedThreadPool()固定型线程池、newScheduledThreadPool()调度型线程池、SingleThreadExecutor 单例线程
62.Android 消息队列模型。
Android通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。
Android系统中,Looper负责管理线程的消息队列和消息循环。我们可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。
一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper)。
Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。
Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。
63.Android 排序算法。
1、直接选择排序。将数据分成两个区域,有序区与无序区。排序的时候是每次从无序区中选择出最小的数,然后插入到有序区中的最末尾,从而形成更大的有序区。直到无序区中的数为零,结束排序。
2、冒泡排序。相邻的两个数两两进行比较,拿从小到大说明,进行冒泡排序后会将大的数沉到底部,将小得数浮到顶部。所以冒泡说法由此得名。
3、直接插入排序。将需要排序的关键数与前面已经排好序的数据从后往前进行比较,使其插入到合适的位置。
4、归并排序。采用的是分治的思想,将待排序的序列分成若干组,保证每组都有序,然后再进行合并排序,最终使整个序列有序。
5、快速排序。将一个待排序序列分成两个部分,以其中的一个数据作为分界线,其中一部分小于这个分界线的数据,另一部分大于这个分界线的数据。因为采用递归的思想,再对这两个序列进行快速排序,直到所以的数据都是有序的。
6、希尔排序。记录增量来进行分组,再对分组内部进行直接插入排序,随着增量的不断减小,直到增量减小到1时,即每个分组中的数据量为1,此时排序结束。
7、堆排序。采用树的形式的数据结构来进行排序的,其中每一个堆都是完全二叉树。堆排序分为大根堆与小根堆,大根堆(小根堆)表示在完全二叉树中,所用的非叶子节点都大于等于(小于等于)他们左右子节点(存在)。所以堆的顶点不是最大数就是最小数。这样的话我们就可以借助这种性质,每次都取出大根堆(小根堆)的顶点数,形成有序序列。
来源:七大排序算法总结(java): https://segmentfault.com/a/1190000005753446
64.Android 设计模式。
1、单例模式。确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2、工厂方法模式。定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
3、抽象工厂模式。为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
4、模版方法模式。定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
5、建造者模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
6、代理模式。为其他对象提供一种代理以控制对这个对象的访问。
7、原型模式。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。
8、中介者模式。用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。中介者模式的优点适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
9、命令模式。意图:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作。动机:将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。
10、责任链模式。使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
11、装饰模式。又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
12、策略模式。定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。策略模式的好处在于你可以动态的改变对象的行为。
13、适配器模式。基于现有类所提供的服务,向客户提供接口,以满足客户的期望。适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
14、迭代器模式。提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
15、组合模式。将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。对象通过实现(继承)统一的接口(抽象类),调用者对单一对象和组合对象的操作具有一致性。
16、观察者模式。定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
17、门面模式。外部与一个子系统的通信必须通过一个统一的门面对象进行。
18、备忘录模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。 19、访问者模式。封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
20、状态模式。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
21、解释器模式。给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
22、享元模式。复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗。Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。23、桥梁模式。将抽象和实现解耦,使得两者可以独立地变化。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。
来源:Android 设计模式: http://blog.csdn.net/banketree/article/details/24985607
65.Android 虚拟机。
1、Dalvik虚拟机。安卓4.4以前。JIT编译器 即时编译器。Dalvik经过优化后,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。其实就是每一个应用都是作为独自的虚拟机运行,与其他应用互不牵扯。
2、ART虚拟机。安卓4.4以后。AOT这种预编译。在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用。减少了手机的电量消耗,提高了移动设备的续航能力,在垃圾回收等机制上也有了较大的提升。
66.Android 性能优化。
性能优化目的是为了减少大多数用户感知到的卡顿。
1、布局复杂。布局深度,复杂度和控件数量。
2、内存抖动。多图会造成频繁的GC,在Android中的GC操作必须暂停所有其余操作,过多的GC会产生内存抖动,对系统性能造成非常大的影响。
3、过度绘制。在一帧内同一点被重复绘制多次,这造成了系统不必要的损耗,极大浪费了系统资源。
来源 知乎 :https://www.zhihu.com/question/30033704
4、把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中。
5、避免ANR。不要在主线程(UI线程)里面做繁重的操作。
6、在线程中初始化查询操作。当查询操作正在后台处理时,展示数据也不是即时的,但是你可以使用CursorLoader对象来加快速度,这个操作可以使Activity和用户之间的互动不受影响。使用这个对象后,你的App会为ContentProvider初始化一个独立的后台线程进行查询,当查询结束后就会给调用查询的Activity返回结果。
7、如果初始化操作很费时,请展示一个欢迎界面。
8、电量消耗。优化网络请求与数据解析。
9、流量占用。没有网络连接,请让你的应用跳过网络操作。使用流量时,提示用户是否进行大资源下载。
来源:十大技巧优化Android App性能 :http://mobile.51cto.com/abased-455556.htm
1、基础很重要。这个相信大家都深有体会。
2、项目要深入。做项目不能浅尝辄止,这个参加过面试的人应该都会有所体会。
3、心态很重要。跟高考一样,面试中心态不好,会很影响临场的发挥。
4、细节决定成败。从基础到项目,这个都会有所体现。
5、坚持写博客。虽然面试到现在,只有一个面试官看了我的博客,但写博客真的是一件有百利而无一害的事情。
6、凡事要讲究缘分。有些时候,有些事,确实要看缘分,所以把心放宽些,不要刻意放大一些痛苦。
7、付出总会有所收获,问题的关键在于你是否坚持的足够久。认识的一些付出了很多努力的小伙伴,虽然也是一路磕磕绊绊,但最终都有了比较好的结果。
来源:2015互联网校招总结—一路走来: http://blog.csdn.net/ns_code/article/details/40408397
转载请注明出处: http://blog.csdn.net/iwanghang/
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:[email protected]