Android异常与性能优化问题

2017-11-21  本文已影响25人  程序猿BOSS

一、ANR(Application Not Responding)问题

1、什么是ANR(Application Not Responding)
ANR就是一个程序无响应的对话框

在一个Activity(Service)当中最长的执行时间是5秒,超出5秒无响应就会导致ANR
在一个BroadcastReceiver当中最长的执行时间是10秒,
原因:在主线程中做了耗时操作,所以才会导致ANR的弹框

2、造成ANR的主要原因

应用程序的响应性是由Activity Manager和WindowManager系统服务监视的,当它监测到Activity和BroadcastReceiver当中5秒、10秒没有执行完任务之后。安卓就会弹出ANR的对话框

3、造成ANR的主要原因-Android中哪些操作是在主线程呢?
4、如何解决ANR

二、OOM(Out of Memory)问题

1、什么是oom

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常,最常见的oom就是bitmap加载大图的时候。

2、一些容易混淆的概念
3、如何解决oom

1、有关bitmap优化

2、ListView

三、Bitmap相关问题

bitmap是存在native内存和Java内存当中的,当被回收的时候分两部分回收。一是回收Java内存当中的内存二是回收native内存当中的内存。
1、Recycle

recycle释放bitmap内存的时候,会释放和这个bitmap有关的native内存,同时会清理有关数据对象的引用。但不是立即清理,它会给垃圾回收器发送消息指令。让它在没有其他对象引用这个bitmap对象的时候,进行垃圾回收。
当bitmap调用recycle之后,bitmap会被标记为“dead”。这个时候你再调用bitmap的其他方法就会引起异常。比如getPixels()或者setPixels(),同时recycle操作是不可逆的。所以你要确定被recycle之后不再调用这个bitmap对象以及它的任何方法,否则就会引起异常。官方建议我们不主动调用recycle方法,当没有对象引用这个bitmap的时候垃圾回收器会主动的回收这个对象。

2、LRU算法
3、计算inSampleSize
// 根据maxWidth, maxHeight计算最合适的inSampleSize
    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // 图像的原始高度和宽度
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float)height / (float)reqHeight);
            } else {
                inSampleSize = Math.round((float)width / (float)reqWidth);
            }
        }
        return inSampleSize;
    }
4、缩略图
//缩略图
    public static Bitmap thumbnail(String path,
                                   int maxWidth, int maxHeight, boolean autoRotate) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        // 获取这个图片的宽和高信息到options中, 此时返回bm为空
        Bitmap bitmap = BitmapFactory.decodeFile(path, options);
        options.inJustDecodeBounds = false;
        // 计算缩放比
        int sampleSize = calculateInSampleSize(options, maxWidth, maxHeight);
        options.inSampleSize = sampleSize;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        options.inPurgeable = true;
        options.inInputShareable = true;
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
        }
        bitmap = BitmapFactory.decodeFile(path, options);
        return bitmap;
    }
5、三级缓存

四、UI卡顿问题

1、UI卡顿原理

UI渲染系统做了太多的耗时操作,和执行了大量的动画。
60fps->16ms
过渡绘制:UI布局中有大量重叠的部分,多层次的UI结构中。

2.UI卡顿的原因分析
3、UI卡顿总结

五、内存泄露问题

1、java内存的分配策略
2、java中的内存泄露

内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。

六、Android内存管理机制

1、分配机制

操作系统会为每个进程分配一个合理大小的内存,从而保证每一个进程能够正常的运行。而不至于内存不够使用或者每个进程占用太多的内存

2、回收机制

在系统内存不够的时候,他会有一个合理的回收再分配机制从而保证新的进程能够正常的运行。

3、内存管理机制的特点
4、内存优化的方法

七、冷启动优化

1、冷启动的定义

冷启动就是在启动应用前,系统中没有该应用的任何进程信息

2、冷启动和热启动的区别

热启动:用户使用返回键退出应用,然后马上又重新启动应用。热启动的应用的进程是保留在后台的

3、冷启动的流程
4、冷启动流程-总结

Application的构造方法->attachBaseContext()->onCreate()->Activity的构造方法->onCreate()->配置主题中背景等属性->onStart()->onResume()->测量布局绘制显示在界面上

5、 如何对冷启动的时间进行优化

八、其他优化问题

1、Android不用静态变量储存数据
2、有关SharePreference问题
3、内存对象的序列化

序列化:将对象的状态信息转换为可以储存或传输的形式的过程

4、 内存对象序列化-总结

推荐使用Serializeble进行数据序列化

避免在UI线程中做繁重的操作

上一篇 下一篇

猜你喜欢

热点阅读