Android面试常见_性能优化问题

1,如何检测一段代码的执行时间?
在做项目的时候有时候需要对一段程序代码或者对一个操作测试时间,那代码可以如下:

long startTime = System.nanoTime();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.nanoTime();
Log.i(TAG,“endTime - startTime====”+(endTime - startTime));
Log.i(TAG,"(endTime - startTime) / 1e6d===="+((endTime - startTime) / 1e6d));
Log.i(TAG, String.format(“时间间隔 for %s in %.1fms%s”,
“測試的時間”, (endTime - startTime) / 1e6d, “測試的时间”));

2,界面卡顿如何修复?
UI卡顿的根本原因:
Android每个16ms就会绘制一次Activity,通过上述的结论我们知道,如果由于一些原因导致了我们的逻辑、CPU耗时、GPU耗时大于16ms,UI就无法完成一次绘制,那么就会造成卡顿。简单的一句话就是:卡主线程了。
比如说,在16ms内,发生了频繁的GC:
在第一个16ms内,UI正常地完成了绘制,那么屏幕不会卡顿。
在第二个16ms内,由于某些原因触发了频发的GC,UI无法在16ms内完成绘制,就会卡顿。
UI卡顿外部和内部常见原因
一、外部因素引起的(以View为区分)
内存抖动的问题
方法太耗时了(CPU占用)
主线程不要做耗时操作
布局中不要做过多嵌套一般使用绝对布局 约束布局
加载大图时禁止滑动刷新
3,滑动不流畅怎么处理?
(1) 对于scrollView与recyclerView嵌套问题
rv.setHasFixedSize(true);
rv.setNestedScrollingEnabled(false);
(2) ListView和GridView列表滑动
1. 使用ViewHolder
2. getView方法中不要进行耗时操作
3. 图片的加载采用三级缓存的方式实现
4. 列表在滑动过程中不加载,停止时才加载
5. 压缩图片大小
6. 开启硬件加速
7. 其他细节改善
4,50fps 有什么办法可以提高到 60fps?
60 fps 的意思是说,画面每秒更新60次
这60次更新,是要均匀更新的,不是说一会快,一会慢,那样视觉上也会觉得不流畅
每秒60次,也就是 1/60 ~= 16.67 ms 要更新一次
要看你的显卡,显卡不行,再急也没用!!显卡勉强可以的话就把品质设置到最低,特效全关了!一个就行了!升级显卡驱动,调低一些画质,网络弄快点。
5,内存泄露怎么检测?
内存泄漏检测工具
Profiler

其实Android studio自带的 Profiler 是不错的,可以很直观看到CPU、内存、网络的变化,但是有时候简单看看是看不出来内存泄漏的,需要知道具体怎么去分析
具体使用:https://www.jianshu.com/p/1972a6d1f0fc
Android LeakCanary

Android LeakCanary易于集成,自动检测出内存泄漏,十分好用
这个东西特别简单,直接看官网就行了
就是GitHub地址:https://github.com/square/leakcanary
6,leakcanay 的原理?
LeakCanary是安卓中用来检测内存泄露的小工具,它能帮助我们提早发现代码中隐藏的bug, 降低应用中内存泄露以及OOM产生的概率。
LeakCanary的使用非常简单,只要通过LeakCanary的install()方法,获取RefWatcher对象,然后调用RefWatcher的watch()方法进行监控需要被观察的引用对象。如果只是需要监控Activity引用对象,则更简单,只需在Application的onCreate()的方法中调用LeakCanary.install()方法,就可以完成监控操作(备注:针对Android 4.0以上,如果是Android 4.0以下,则还需要主动调用RefWatcher的watch()方法进行监控)。

RefWatcher监控内存泄漏的原理主要是借助弱引用对象KeyedWeakReference与被监控的引用对象进行关联,当被监控的引用对象被回收时,则与之关联的弱引用对象也会被回收,并放入到一个引用队列中。通过在引用队列中查找是否存在该引用对象,来判断对象是否泄漏了。

当对象发生了内存泄漏,则通过Debug类的dumpHprofData()方法获取堆内存快照hprof文件,然后通过开源项目HaHa分析hprof文件,并将分析结果(内存泄漏对象到GC Roots的最短引用链路)通过DisplayLeakService服务发送给用户查看。

你可能感兴趣的:(java常用面试题)