安卓文章

安卓面试题

2021-04-18  本文已影响0人  Joy_yang17

面试题总结

Java基础

1. synchronized关键字

synchronized关键字.png

2. synchronized 关键字和 volatile 关键字的区别?

3. ArrayList 和 LinkList 区别、优劣势

Android基础

1. 实现一个自定义View的基本流程

2. Android异步消息处理机制

3. Android Handler消息机制?

Handler 内存泄漏原因?:
将 Handler 定义成静态的内部类,在内部持有 Activity 的弱引用,并在Acitivity的onDestroy()中调用handler.removeCallbacksAndMessages(null)及时移除所有消息。

4. 图片适配怎么做的?

屏幕尺寸适配.png

5. 图片加载与优化怎么做的?
优化: 图片的三级缓存 好处:减少不必要的网络交互。从加载的图片的本身和手机的存储两方面考虑。
使用图片压缩:通过BitmapFactory.Options就可以按一定的采样率来加载缩小后的图片。

图片加载与优化.png

6.Android三级缓存?
网络加载: 不优先加载,速度慢,浪费流量
本地缓存: 次优先加载,速度快
内存缓存: 优先加载,速度最快
首次加载Android App时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中,之后运行APP时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中图片,最后选择访问网络

7. Parcelable 和 Serializable的区别和使用

8. 性能优化,具体做了哪儿些操作?
卡顿优化:UI 绘制、应用启动、页面跳转、事件响应、布局优化

9. binder消息机制
Binder是Android系统进程间通信(IPC)方式之一 ,Binder更加简洁和快速,消耗的内存资源更小。
Binder主要能提供以下一些功能:
用驱动程序来推进进程间的通信。
通过共享内存来提高性能。
为进程请求分配每个进程的线程池。
针对系统中的对象引入了引用计数和跨进程的对象引用映射。

10. 事件分发机制

10. 内存泄漏与内存溢出的原因及解决方案?
内存泄漏(Memory leak): 当一个对象不在使用了,本应该被垃圾回收器(JVM)回收,但是这个对象由于被其他正在使用的对象所持有,造成无法被回收的结果,通俗点就是系统把一定的内存值A借给程序,但是系统却收不回完整的A值,那就是内存泄漏。

内存溢出(Out of memory): 系统会给每个APP分配内存也就是Heap size值,当APP所需要的内存大于了系统分配的内存,就会造成内存溢出;就是程序A找系统借内存实例化对象,但是系统没有那么多内存可借。导致功能实现失败。这就是内存溢出。

<u>内存泄漏是造成内存溢出(OOM)的主要原因,因为系统分配给每个程序的内存也就是Heap size的值都是有限的,当内存泄漏到一定值的时候,最终会发生程序所需要的内存值加上泄漏值大于了系统所分配的内存额度,就是触发内存溢出。</u>

Android中内存泄漏、内存溢出的原因以及解决方案
1、大量的图片、音频、视频处理,当在内存比较低的系统上也容易造成内存溢出
建议使用第三方,或者JNI来进行处理
2、Bitmap对象的不正确处理(内存溢出)

3、非静态匿名内部类Handler由于持有外部类Activity的引用所造成的内存泄漏
根据WeakReference对象,对handler使用弱引用,并且调用removeCallbacksAndMessages移除
4、线程由于匿名内部类runnable持有activity的引用,从而关闭activity,线程未完成造成内存泄漏
把线程改成静态内部类,调用WeakReference来持有外部资源
5、BraodcastReceiver、File、Cursor等资源的使用未及时关闭
在销毁activity时,应该及时销毁或者回收
6、static关键字修饰的变量由于生命周期过长,容易造成内存泄漏
尽量少使用静态变量,一定要使用要及时进行制null处理
7、单列模式造成的内存泄漏
如context的使用,单列中传入的是activity的context,在关闭activity时,activity的内存无法被回收,因为单列持有activity的引用
在context的使用上,应该传入application的context到单列模式中,这样就保证了单列的生命周期跟application的生命周期一样
单列模式应该尽量少持有生命周期不同的外部对象,一旦持有该对象的时候,必须在该对象的生命周期结束前制null

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。

Android Handler消息机制?

Handler 内存泄漏原因?:
将 Handler 定义成静态的内部类,在内部持有 Activity 的弱引用,并在Acitivity的onDestroy()中调用handler.removeCallbacksAndMessages(null)及时移除所有消息。
AsyncTask也一样,应被声明为Activity的静态内部类。

AsyncTask
作用:
实现多线程
在工作线程中执行任务,如 耗时任务
异步通信、消息传递
实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作,从而保证线程安全。
优点:

使用步骤有3个:
创建 AsyncTask 子类 & 根据需求实现核心方法

类中参数为3种泛型类型
整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型
具体说明:
a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数
b. Progress:异步任务执行过程中,返回下载进度值的类型
c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
注:
a. 使用时并不是所有类型都被使用
b. 若无被使用,可用java.lang.Void类型代替
c. 若有不同业务,需额外再写1个AsyncTask的子类
创建 AsyncTask子类的实例对象(即 任务实例)
手动调用execute()从而执行异步线程任务

跨进程通信
Intent,比如拨打电话
ContentProvider,数据库存储数据
Broadcast,广播通信
AIDL通信,通过接口共享数据

设计模式

1. 简述单例模式
单例模式1
单例模式2

2. 简述观察者模式
观察者模式

3. 简述责任链模式
责任链模式

框架类

图片类框架

图片加载框架有哪些?他们之间的区别是什么?

网络类框架

网络框架有哪些?他们之间的区别是什么?

retrofit使用
1.在retrofit中通过一个接口作为http请求的api接口;
2.创建一个Retrofit实例
3.调用API接口(调用网络请求的接口获取网络请求)

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 本身封装的也更易用,扩展性更好些。
OkHttp VS Retrofit 毫无疑问,Retrofit 默认是基于 OkHttp 而做的封装,这点来说没有可比性,肯定首选 Retrofit。
Volley VS Retrofit 这两个库都做了不错的封装,但Retrofit解耦的更彻底,尤其Retrofit2.0出来,Jake对之前1.0设计不合理的地方做了大量重构, 职责更细分,而且Retrofit默认使用OkHttp,性能上也要比Volley占优势,再有如果你的项目如果采用了RxJava ,那更该使用 Retrofit 。所以这两个库相比,Retrofit更有优势,在能掌握两个框架的前提下该优先使用 Retrofit。但是Retrofit门槛要比Volley稍高些,要理解他的原理,各种用法,想彻底搞明白还是需要花些功夫的,如果你对它一知半解,那还是建议在商业项目使用Volley吧。

上一篇 下一篇

猜你喜欢

热点阅读