美文网首页Android开发
阿里Android开发手册读后感-下篇

阿里Android开发手册读后感-下篇

作者: sugaryaruan | 来源:发表于2018-03-08 17:57 被阅读12次

阅读阿里安卓开发手册系列最后一篇,以下是一些让我印象深刻的点,顺带记录自己简单的思考

【强制】使用完毕的图片,应该及时回收,释放宝贵的内存。

我的思考:
及时回收的含义是说,对于Bitmap对象用完后要在Activity回调方法里置空。

【推荐】应根据实际展示需要,压缩图片,而不是直接显示原图。

【推荐】使用 ARGB_565 代替 ARGB_888,在不怎么降低视觉效果的前提下,减少内存占用

说明:

android.graphics.Bitmap.Config 类中关于图片颜色的存储方式定义:

  1. ALPHA_8 代表 8 位 Alpha 位图;
  2. ARGB_4444 代表 16 位 ARGB 位图;
  3. ARGB_8888 代表 32 位 ARGB 位图;
  4. RGB_565 代表 8 位 RGB 位图。

位图位数越高,存储的颜色信息越多,图像也就越逼真。大多数场景使用的是 ARGB_8888 和 RGB_565,RGB_565 能够在保证图片质量的情况下大大减少内存的开销,是解决 oom 的一种方法。

但是一定要注意 RGB_565 是没有透明度的,如果图片本身需要保留透明度,那么就不能使用 RGB_565。

我的思考:
压缩图片有两种方式:1.采样压缩 2.质量压缩

采样压缩模版代码:

fun sampleBitmapFromResource(res: Resources, resId: Int, reqWidth: Int, reqHeight: Int): Bitmap {
    val options = BitmapFactory.Options()
    options.inJustDecodeBounds = true
    BitmapFactory.decodeResource(res, resId, options)
    options.inJustDecodeBounds = false
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
    return BitmapFactory.decodeResource(res, resId, options)
}

fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
    var outWidth = options.outWidth
    var outHeight = options.outHeight
    var sampleSize = 1
    while (outWidth > reqWidth || outHeight > reqHeight) {
        outWidth = outWidth / 2
        outHeight = outHeight / 2
        sampleSize = sampleSize * 2
    }
    return sampleSize
}

质量压缩就是把没有透明度的位图从ARGB_8888转成RGB_565,让每个像素占用的内容从4byte降到1byte。

Drawable转BitmapKotlin代码:

fun drawableToBitmap(drawable: Drawable): Bitmap {
    return when (drawable) {
        is BitmapDrawable -> drawable.bitmap
        else -> {
            val config = if (drawable.opacity != PixelFormat.OPAQUE)
                Bitmap.Config.ARGB_8888
            else
                Bitmap.Config.RGB_565

            val intrinsicWidth = drawable.intrinsicWidth
            val intrinsicHeight = drawable.intrinsicHeight
            val bitmap = Bitmap.createBitmap(Math.max(intrinsicWidth, 2), Math.max(intrinsicHeight, 2), config)
            val canvas = Canvas(bitmap)
            drawable.setBounds(0, 0, canvas.width, canvas.height)
            drawable.draw(canvas)
            return bitmap
        }
    }
}

【推荐】使用inBitmap重复利用内存空间,避免重复开辟新内存

【强制】META-INF 目录中不能包含如.apk,.odex,.so 等敏感文件,该文件夹没有经过签名,容易被恶意替换

【推荐】在有强依赖 onAnimationEnd 回调的交互时,如动画播放完毕才能操作页面,onAnimationEnd 可能会因各种异常没被回调,建 议加上超时保护或通过postDelay替代onAnimationEnd

欢迎关注CodeThings

相关文章

  • 阿里Android开发手册读后感-下篇

    阅读阿里安卓开发手册系列最后一篇,以下是一些让我印象深刻的点,顺带记录自己简单的思考 【强制】使用完毕的图片,应该...

  • 看看泓洋老师发布的:安卓开发者的铁血军规《阿里巴巴 Androi

    《阿里巴巴 Android 开发手册》是阿里巴巴集团各大 Android 开发团队的集体智慧结晶和经验总结,将淘宝...

  • 阿里巴巴Android开发手册

    《阿里巴巴Android开发手册》是阿里巴巴集团各大Android开发团队的集体智慧结晶和经验总结,将淘宝、天猫、...

  • 阿里巴巴Android开发手册

    《阿里巴巴Android开发手册》是阿里巴巴集团各大Android开发团队的集体智慧结晶和经验总结,将淘宝、天猫、...

  • 阿里巴巴Android开发手册

    《阿里巴巴Android开发手册》是阿里巴巴集团各大Android开发团队的集体智慧结晶和经验总结,将淘宝、天猫、...

  • Android推荐资源

    《阿里巴巴Android开发手册》下载:https://102.alibaba.com/downloadFile....

  • 一份必不可少的Android书单

    含PDF下载链接,后期持续更新 阿里巴巴Android开发手册 Android高级进阶 Android群英传:神兵...

  • MySQLj建表规约

    下载原版阿里JAVA开发手册 【阿里巴巴Java开发手册v1.2.0】 本文主要是对照阿里开发手册,注释自己在...

  • 阿里Android开发手册

    【强制】 必须遵守,违反本约定或将会引起严重的后果; 【推荐】 尽量遵守,长期遵守有助于系统稳定性和合作效率的提升...

  • 阿里Android开发手册

    【强制】 必须遵守,违反本约定或将会引起严重的后果; 【推荐】 尽量遵守,长期遵守有助于系统稳定性和合作效率的提升...

网友评论

    本文标题:阿里Android开发手册读后感-下篇

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