美文网首页
android防止OOM的简单总结

android防止OOM的简单总结

作者: 谜之龙 | 来源:发表于2019-04-15 15:15 被阅读0次

    1.在设置图片时的方法
    //设置资源图片时,尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

     public static Bitmap readBitMap(Context context, int resId){ 
        BitmapFactory.Options opt = new BitmapFactory.Options(); 
        opt.inPreferredConfig = Bitmap.Config.RGB_565; 
        opt.inPurgeable = true; 
        opt.inInputShareable = true; 
        //获取资源图片         InputStream is = context.getResources().openRawResource(resId); 
        return BitmapFactory.decodeStream(is,null,opt); 
    }
    

    2、动态回收内存算是最简单的解决方法吧,就是手动的调用System.gc();
    bitmap.recycle()方法用于回收该bitmap所占用的内存,用System.gc()调用一下系统的垃圾回收器。

    if (bitmap != null && !bitmap .isRecycled()) {
         bitmap .recycle();
         bitmap = null;
    }
    System.gc();
    

    3.压缩图片的展示

    //压缩,用于节省BITMAP内存空间--解决BUG的关键步骤 
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 2;//这个的值压缩的倍数(2的整数倍),数值越小,压缩率越小,图片越清晰 
    //返回原图解码之后的bitmap对象
    Bitmap  bitmap = BitmapFactory.decodeResource(getResources(),
                    R.drawable.begin_background, opts);
    

    4.在Activity里在结束时一定要关闭现场
    (1)总结一下避免Context泄漏应该注意的问题:
    (2)尽量使用Application这种Context类型。
    (3)注意对Context的引用不要超过它本身的生命周期。
    (4)慎重的对Context使用“static”关键字。
    (5)Context里如果有线程,一定要在onDestroy()里及时停掉
    5.集合的处理
    我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
    6.android的程序对象
    些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。调用registerReceiver后未调用unregisterReceiver。
    虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉

    相关文章

      网友评论

          本文标题:android防止OOM的简单总结

          本文链接:https://www.haomeiwen.com/subject/copuwqtx.html