Android图片系列-2.Android App图片压缩、裁剪分析整理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

移动端常用的图片格式有PNG和JPEG,目前ios手机和大部分安卓手机拍照生成的图片默认格式都是JPEG。我们开发APP的时候通常使用的是PNG,这可能是考虑到图片质量效果。PNG图片是无损压缩格式,JPEG是有损压缩,PNG格式相比JPEG占用空间要大很多。2010年GOOGLE开发了一种新的图片压缩格式WEBP,可以将图片空间压缩的更小,平均是JPEG的2/3,Android从4.0开始默认支持WEBP格式。关于JPEG、PNG网上有很多介绍,本文主要介绍自己在实际开发中遇到问题处理方法的一些总结经验。

一 图片格式

在电脑中,JPEG(发音为jay-peg, IPA:[ˈdʒeɪpɛg])是一种针对照片视频而广泛使用的一种有损压缩标准方法。这个名称代表Joint Photographic Experts Group(联合图像专家小组)。此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。JPEG与视频音频压缩标准的MPEG(Moving Picture Experts Group)很容易混淆,但两者是不同的组织及标准。
JPEG格式介绍

便携式网络图形(Portable Network Graphics,PNG)是一种无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以被广泛应用于互联网及其他方面上。
PNG格式介绍

二 图片压缩

1.1 压图片

压图片是指图片占用存储空间和图片质量的压。记得以前做手机rom的时候,为了缩减app包的体积,我们会使用工具比如tinypng对UI工程师给的PNG图片进行压缩,平均下来可以压缩百分之三四十,这与图片本身的色彩有关系。

IOS压图片

UIImageJPEGRepresentation压缩图片,压缩率用1图片处理后占用的存储空间会变大,使用0.8的时候大小与图片原来存储大小接近。看到一些分析,图片压缩率根据场景需要自己来配置,建议参考范围是0.6~1。如果压缩率太小,图片质量会非常糟糕。开始使用阿里云OSS存储的时候发现这个问题,以为是阿里SDK造成的,还给阿里提了一个工单,前后沟通了一个多月,阿里的售后坚持说他们的SDK没有这个问题,最终不了了之。

压缩次数图片大小
01M
14M
24.8M
35M

表1.1.1 UIImageJPEGRepresentation使用压缩率1处理图片

ANDROID压图片

Android 使用Bitmap来处理图片,先来看下bitmap的压缩方法compress,代码如下:

//Bitmap.java
/** 
    * Write a compressed version of the bitmap to the specified outputstream. 
    * If this returns true, the bitmap can be reconstructed by passing a 
    * corresponding inputstream to BitmapFactory.decodeStream(). Note: not 
    * all Formats support all bitmap configs directly, so it is possible that 
    * the returned bitmap from BitmapFactory could be in a different bitdepth, 
    * and/or may have lost per-pixel alpha (e.g. JPEG only supports opaque 
    * pixels). 
    * 
    * @param format   The format of the compressed image 
    * @param quality  Hint to the compressor, 0-100. 0 meaning compress for 
    *                 small size, 100 meaning compress for max quality. Some 
    *                 formats, like PNG which is lossless, will ignore the 
    *                 quality setting 
    * @param stream   The outputstream to write the compressed data. 
    * @return true if successfully compressed to the specified stream. 
*/
compress(CompressFormat format, int quality, OutputStream stream)
  1. CompressFormat支持三种格式PNG、JPG、WEBP
  2. quality 取值范围0~100,100代表最小压缩,图片保存质量最高。
  3. 经过实测,将PNG或者JPG图片压缩成WEBP非常耗时,对于实时处理需求的场景不适合通过此方法来达到减小图片占用空间的目的。

另外,Bitmap还提供了一个内部类Config

 /**
     * Possible bitmap configurations. A bitmap configuration describes
     * how pixels are stored. This affects the quality (color depth) as
     * well as the ability to display transparent/translucent colors.
     */
    public enum Config {
        // these native values must match up with the enum in SkBitmap.h

        /**
         * Each pixel is stored as a single translucency (alpha) channel.
         * This is very useful to efficiently store masks for instance.
         * No color information is stored.
         * With this configuration, each pixel requires 1 byte of memory.
         */
        ALPHA_8     (2),

        /**
         * Each pixel is stored on 2 bytes and only the RGB channels are
         * encoded: red is stored with 5 bits of precision (32 possible
         * values), green is stored with 6 bits of precision (64 possible
         * values) and blue is stored with 5 bits of precision.
         * 
         * This configuration can produce slight visual artifacts depending
         * on the configuration of the source. For instance, without
         * dithering, the result might show a greenish tint. To get better
         * results dithering should be applied.
         * 
         * This configuration may be useful when using opaque bitmaps
         * that do not require high color fidelity.
         */
        RGB_565     (4),

        /**
         * Each pixel is stored on 2 bytes. The three RGB color channels
         * and the alpha channel (translucency) are stored with a 4 bits
         * precision (16 possible values.)
         * 
         * This configuration is mostly useful if the application needs
         * to store translucency information but also needs to save
         * memory.
         * 
         * It is recommended to use {@link #ARGB_8888} instead of this
         * configuration.
         *
         * Note: as of {@link android.os.Build.VERSION_CODES#KITKAT},
         * any bitmap created with this configuration will be created
         * using {@link #ARGB_8888} instead.
         * 
         * @deprecated Because of the poor quality of this configuration,
         *             it is advised to use {@link #ARGB_8888} instead.
         */
        @Deprecated
        ARGB_4444   (5),

        /**
         * Each pixel is stored on 4 bytes. Each channel (RGB and alpha
         * for translucency) is stored with 8 bits of precision (256
         * possible values.)
         * 
         * This configuration is very flexible and offers the best
         * quality. It should be used whenever possible.
         */
        ARGB_8888   (6);

        final int nativeInt;

        @SuppressWarnings({"deprecation"})
        private static Config sConfigs[] = {
            null, null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888
        };

        Config(int ni) {
            this.nativeInt = ni;
        }

        static Config nativeToConfig(int ni) {
            return sConfigs[ni];
        }
    }

从代码看到bitmap包括ALPHA_8(8位)、ALPHA_565(16位)、ALPHA_4444(16位)、ALPHA_8888(32位)四种配置色彩。bitmap是一种使用像素点来表达图片的存储方式,一张图片分辨率是3776 * 2520,图片色彩模式是ARGB 32位,那么图片加载的时候消耗的内存空间:3776 * 2520 * 4byte = 38062080byte = 38M。bitmap是非压缩存储格式,因此占用内存空间会非常大。所以通过不同的色彩配置也可以达到图片压缩的效果,比如选择ALPHA_565(16位),图片占用内存空间就会比32位减小一半,保存成jpg格式的时候也会小。

1.2 图片缩

图片缩是指图片分辨率的裁剪。图片的裁剪使用场景很多:
1. listview ,recycleview加载图片列表,此时应该使用缩略图。当点击查看item的时候才呈现大图。
2. 假设移动设备分辨率只有1024X600,设备端应用分配的堆内存是64M。存储的图片分辨率是3776 * 2520,图片色彩模式是ARGB 32位,那么图片加载的时候消耗的内存空间38M。这个数值已经快接近该应用能够分配的最大内存空间了,如果图片分辨率再高一些,就会直接报内存溢出的错误提示。因此在加载之前,我们可能需要针对设备配置对图片进行裁剪。在下文会谈到的开源图片加载库Android Universal Imageloader里面就做了类似处理,代码里面有限制加载的图片分辨率如果长或者宽大于等于2048,就会把这个图片分辨率减小。

/**
 * UIL 图片裁剪
 */
public final class ImageSizeUtils {
    //设置最大值为2048,超过这个值就会将分辨率缩小
    private static final int DEFAULT_MAX_BITMAP_DIMENSION = 2048;

    private static ImageSize maxBitmapSize;

    static {
        int[] maxTextureSize = new int[1];
        GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
        int maxBitmapDimension = Math.max(maxTextureSize[0], DEFAULT_MAX_BITMAP_DIMENSION);
        maxBitmapSize = new ImageSize(maxBitmapDimension, maxBitmapDimension);
    }

...

//ImageLoader.java
//可以使用UIL加载指定大小的图片,具体的参数由ImageSize来控制。
    public void loadImage(String uri, ImageSize targetImageSize, ImageLoadingListener listener) {
        loadImage(uri, targetImageSize, null, listener, null);
    }

3 . 比如我们做的电子相框,显示图片的时候由于图片的分辨率长宽比与相框设备分辨率长宽比不一样,会导致图片无法全屏展示。如果我们想要实现全屏显示图片,就需要对图片进行裁剪,裁剪思路就是将图片裁成一个长宽比与设备长宽比一致。如果是针对竖屏显示的设备,方法是相通的。

//将图片裁剪成与设备长宽比一致。裁剪方法是针对横屏显示设备只裁剪宽大于等于高的图片,因为如果对高大于宽的图片也裁剪,会使得图片内容变化较大。因此,我们这里的裁剪算是一种优化,比如一张4:3的图要显示在16:9的设备上,下面的处理就可以将图片优化成全屏显示。
public Bitmap imageCrop(Bitmap bitmap) {
        boolean deviceLand = DEVICE_WIDTH >DEVICE_HEIGHT;
        float w = bitmap.getWidth(); // 得到图片的宽,高
        float h = bitmap.getHeight();
        boolean bitmapLand = w>=h;
        float retX = 0;
        float retY = 0;
        //先处理横屏设备,横屏图片
        if(deviceLand && bitmapLand){
            float deviceRatio = Constants.DEVICE_WIDTH / Constants.DEVICE_HEIGHT;
            float bitmapRatio = w / h ;
            if (bitmapRatio > deviceRatio){
                float cropWidth = h * deviceRatio;
                retX = (w - (int)cropWidth)/2;
                Bitmap cropBitmap = Bitmap.createBitmap(bitmap, (int)retX, (int)retY, (int)cropWidth, (int)h, null, false);
                return cropBitmap;
            }else {
                float cropHeight = w / deviceRatio;
                retY = (h - (int)cropHeight)/2;
                Bitmap cropBitmap = Bitmap.createBitmap(bitmap, (int)retX, (int)retY, (int)w, (int)cropHeight, null, false);
                return cropBitmap;
            }
        }else if(!deviceLand && !bitmapLand){

        }
        return bitmap;
    }

安卓开源有一个很不错的图片裁剪控件,是知名公司yalantis的作品。ucrop图片裁剪库

三 图片格式转换

既然WEBP格式最小,那么在对图片清晰度没有非常高的要求下,为了节省带宽流量,移动端可以在上传的时候将PNG和JPEG格式的图片转换为WEBP,但是实际使用过程发现在移动端转换成WEBP格式图片的耗时非常久,体验不好,因此如果这种方式并不能通用。服务器也可以在下发给移动端图片的时候将PNG和JPEG格式的图片转换为WEBP,目前阿里云已经开通了这个服务,不过是收费的,但是费用相比因为流量减小节省的成本还是非常划算的。

阿里云图片处理服务 提供了图片格式转换、图片裁剪、图片旋转、图片效果等在线api服务。

四 图片的方向

现在苹果手机、一些安卓手机自带的相机应用,拍照的时候不管手机方向怎么旋转,拍出来的图片用相册预览的时候发现都是正的。使用数码相机或者手机倒着拍一些照片,然后将图片导入windows7系统,可以看到倒着的图片,导入windows10系统图片预览的时候全是正的。这说明图片内部存储了方向这个信息,图片浏览器在展示图片的时候可以选择是否依据图片方向的值对图片进行校正。

可交换图像文件格式常被简称为Exif(Exchangeable image file format),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
Exif最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。
Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
Windows 7操作系统具备对Exif的原生支持,通过鼠标右键点击图片打开菜单,点击属性并切换到详细信息标签下即可直接查看Exif信息。
Exif信息是可以被任意编辑的,因此只有参考的功能。
Exif信息以0xFFE1作为开头标记,后两个字节表示Exif信息的长度。所以Exif信息最大为64 kB,而内部采用TIFF格式
WIKI

//Android读取图片方向信息
public int readPictureDegree(String imagePath) {
        int imageDegree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(imagePath);
            int orientation = exifInterface.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                imageDegree = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                imageDegree = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                imageDegree = 270;
                break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return imageDegree;
    }

    //根据图片方向信息旋转图片
    public Bitmap rotaingImageView(int angle, Bitmap mBitmap) {
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        Bitmap b = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
                mBitmap.getHeight(), matrix, true);
        return b;
    }

五 安卓开源的图片加载框架

安卓图片处理框架,目前我只用过UIL。最近准备把另外三个框架学习一下,毕竟UIL已经停止维护了,要跟着新技术的脚步,是时候切换一下新的生产力工具了。毕竟从说明来看,fresco在内存OOM问题上表现的更为出色。拭目以待。

Memory
A decompressed image - an Android Bitmap - takes up a lot of memory. This leads to more frequent runs of the Java garbage collector. This slows apps down. The problem is especially bad without the improvements to the garbage collector made in Android 5.0.
On Android 4.x and lower, Fresco puts images in a special region of Android memory. It also makes sure that images are automatically released from memory when they’re no longer shown on screen. This lets your application run faster - and suffer fewer crashes.
Apps using Fresco can run even on low-end devices without having to constantly struggle to keep their image memory footprint under control.

图片系列链接:Android图片系列-1.如何选择图片加载框架

  1. UIL Universal ImageLoader
  2. Picasso
  3. Glide
  4. Fresco

参考:

  1. 阿里云图片处理服务
  2. EXIF WIKI文档
  3. JPEG格式介绍
  4. PNG格式介绍
整理一线APP用到的一些技术 通过解压一些日常生活中经常用到的一下大厂的APP,通过查看其lib目录下用到的一些库,来分析这些一线APP用到的那些技术。 库名                  一线APP                                            描述                                      libbspatch.so         QQ 阅读详情

相关推荐

Mac上Cocos Creator安卓打包全攻略:从环境配置到APK签名

在跨平台游戏开发中,安卓打包是一个涉及多工具链集成的关键技术环节。其核心原理在于通过构建系统将游戏代码、资源与原生库整合为可安装的APK文件。这一过程的技术价值在于打通不同操作系统间的开发壁垒,实现一次开发多端部署。在实际应用场景中,开发者常需在macOS环境下配置Java、Android SDK/NDK等依赖,并处理签名、包体优化等工程实践问题。针对Cocos Creator这一流行游戏引擎,**环境配置**与**APK签名**成为确保构建成功的关键步骤,特别是在处理M系列芯片与Intel架构差异时,正确

weixin_33755557的博客 529

Android BitmapFactory的基本使用

问题描述 使用方法BitmapFactory.decodeFile转化Bitmap时报错:java.lang.RuntimeException: Canvas: trying to draw too large(120422400bytes) bitmap. 解决方案 frameworks/base/graphics/java/android/graphics/RecordingCanvas.java public static final int MAX_BITMAP_SIZE = 100 * 1024

特立独行的博客 3767

美团技术整理:Flutter包大小治理上的探索与实践

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,也可以分享给身边好友一起学习。一起互勉~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可免费领取!取!!!!

2401_83703797的博客 2183

Bitmap最大值

#define MAX_BITMAP_SIZE  0x19FE0000 1A280000 可以,后来又不可以了 1AF00000 不可以 0x19600000 可以 19FE0000可以 1A000000不行

xszbzb的专栏 1666

Android 大图加载显示

Android 大图加载显示 文章目录Android 大图加载显示通过本文你能学到什么?一、ImagerView直接放置一张几十M的图片会崩溃吗?二、如何保证加载大图不发生崩溃?三、Glide设置显示大图是否会发生崩溃四、大图缩放滑动如何实现五、大图缩放和滑动框架的使用六、最后总结一下最开始目录学习的内容:共勉:自强不息,才是生活的样子。 通过本文你能学到什么? 1、普通设置方法设置大图片是否会导致界面崩溃,多大的图片才会导致崩溃 2、如何保证加载大图不发生崩溃 3、Glide设置显示大图是否会发生崩溃 4

wenzhi的博客 6172

Android-图片压缩详解:原理、方法与实践

Android应用开发中,处理图片是一个非常常见的需求。然而,大尺寸和高质量的图片可能会占用大量内存,导致应用程序性能下降,甚至引发OOM(Out of Memory)错误。因此,对图片进行合适的压缩是非常重要的。本文将详细介绍Android图片压缩的原理、方法和实践。在本文中,我们详细介绍了Android图片压缩的原理、方法和实践。我们学习了如何使用BitmapFactory.Options进行尺寸压缩和质量压缩,以及如何使用第三方库进行图片压缩

沐雨风栉 6720

最详细的Android图片压缩攻略,让你一次过足瘾

/ 今日科技快讯 /近日,微软已经通知业务合作伙伴,将从明年开始上调Office办公套件逐月订购的价格,选择逐年订购服务的客户则不会受到影响。微软宣布将于2022年推出Office...

郭霖 1577

2026手机免费去水印APP及小程序实测,安卓iOS优缺点详解

结合安卓、iOS双端适配性、免费程度、安全性、使用体验,可快速匹配个人需求选型:临时轻度去水印、不想安装APP,优先选择在线去水印小程序,轻量便捷、安全无套路;本地视频素材去水印、追求无损画质,首选剪映,免费稳定、隐私性强;图片精细化去水印、新手日常使用,选择美图秀秀、Inpaint即可;有图文复合处理、进阶修图需求,可选用FotorTool、KapwingTool等专业工具。

GYRYIJF的博客 255

图片转化为PDF的高效工具——Images To PDF

`Images To PDF`是一款简单易用的安卓应用程序,专门用于将你的JPEG或其他图像快速转换为PDF文件。只需几步简单的操作,就能轻松将手机中的照片整理成专业的PDF文档,满足你在工作、学习中的各种需求。 ### 技术分析 该项目采用了众多流行的Android开发库,包括: - **Butterknife** 提供了视图绑定功能,简化UI组件的操作; - **Folderpicker*...

gitblog_00012的博客 1007

8款Word文档压缩大小的方法实测盘点,图片与PDF瘦身工具对比哪几款更顺手

上个月底,我卡在投标系统的最后一关死活传不上去——系统冷冰冰地弹了一句“单个文件过大”。手头这个标书是我改到凌晨才封装完的,大量施工现场图、盖章扫描页堆在一起,光是Word导出成PDF就占了好大一坨。我先是把Word里能压的图片全部用自带功能重调了一遍,还是超限,后来索性把PDF扔进青蓝PDF转换里选了一档中压缩,体积肉眼可见地瘦下来,排版也没跑偏。

asyncs的博客 10

2026手机免费去水印APP推荐安卓iOS无广告好用工具优缺点解析

结合安卓、iOS全设备适配性、免费程度、广告情况、处理效果四大核心维度,可快速匹配个人使用需求:日常本地视频边角水印处理,优先使用剪映,免费稳定无套路;普通图片简单水印去除,美图秀秀足够满足需求;需要批量解析各大平台在线无水印素材、追求无广告免费体验,耶斯去水印适配日常高频轻量场景;遇到复杂动态水印、复杂背景疑难素材,可选择大佬去水印;追求专业高清修复效果,可尝试PixlrX、HitPawRemover等海外工具。

GYRYIJF的博客 254

2026手机免费去水印APP怎么选?安卓苹果通用、安全无广告短视频去水印工具全攻略

日常刷抖音、小红书、B站、视频号等平台,看到优质视频和高清图片想要保存原图,总会被自带平台水印影响观感。很多用户在挑选工具时,核心诉求无非三点:想要,需要适配全机型的,同时想理清各类。本篇2026年最新实测教程,全程无商业推广,纯个人自用干货分享,分为图片去水印APP、短视频去水印APP、免安装微信小程序三大板块,完整梳理各类免费工具的操作流程、适配人群和功能侧重,大家可以根据自身使用场景直接抄作业。

GYRYIJF的博客 106

Android 性能优化】面试必备!超全App性能优化知识技能手册

一、性能优化的地位 用过Android和iOS的朋友应该印象比较深,相比于iOS,Android用的时间越长就会越卡。 在这个网络都追求5G了的时代,“卡”这个体验显然成为了一个极拉低印象分的问题,所以,不只是阿里,还有腾讯、字节跳动、爱奇艺等,都非常重视这个问题,在面试中,如果这个方向表现优异,你将会很值钱。 本文针对“性能优化”这个要点,从各个方面对目标产品进行全方位的“优化”,让产品的性能从各个方面得到提升。 二、App性能优化提要 背景&目的 用户体验 业务转化 降低成本 领域 包体.

weixin_49559515的博客 1584

Cocos Creator 3.8.6安卓打包全流程:从构建到真机部署实战指南

移动游戏开发中,将游戏引擎项目打包成可在安卓设备上运行的应用程序是一个核心环节。其原理在于通过构建工具链,将游戏资源、脚本和引擎运行时库编译、链接并封装成符合安卓系统规范的安装包。这一过程的技术价值在于打通了从开发到分发的关键路径,是实现游戏产品化的必要步骤。在实际应用场景中,开发者常面临环境配置复杂、版本兼容性以及构建优化等挑战。本文聚焦于Cocos Creator引擎,详细解析了**NDK配置**与**Gradle构建**这两个关键环节,提供了从编辑器设置、环境变量配置到APK生成与真机调试的完整、可操

weixin_33749131的博客 508

2026 好用免费图片去水印工具:电脑手机在线、安卓苹果工具实操指南

市面上工具类型繁多,分为免安装小程序、手机端 APP、在线网页工具、电脑客户端四大类。

GYRYIJF的博客 20

Android——APP性能如何优化

1. 四个方面 可以把用户体验的性能问题主要总结为4个类别: 流畅 稳定 省电、省流量 安装包小 性能问题的主要原因归根到底,也就是内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题,整理归类如下: 主要就四点: 快:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。 稳:减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应。 省:节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。 小:安装包小可以降低用户的安装成本。 2. 卡顿优化 按场景

Yawn 916

盘点72Android系统源码安卓爱好者不容错过

盘点72Android系统源码安卓爱好者不容错过

weixin_47730343的博客 1148

2026免费照片去水印app推荐无广告,安卓苹果可用工具优缺点详解

结合免费去水印工具优缺点、设备适配性与使用场景,可快速匹配适合自己的工具:日常临时去水印、不想下载APP、追求无广告纯净体验,优先选择奈斯水印助手、水印魔术手两款小程序,免安装、无付费套路、双端通用,完美适配手机轻量化自用需求;新手日常简单修图、偶尔去除照片水印,美图秀秀足够满足需求,免费功能扎实、操作简单;处理复杂半透明水印、追求AI修复效果,可选FotorTool;需要精细化图片精修、处理设计类素材,PixlrX是优质免费选择。

GYRYIJF的博客 28

从零构建安卓论坛App:MVVM架构、协程与Room数据库实战

移动应用开发领域,构建一个功能完整、体验流畅的客户端应用是核心技能。其关键在于采用合理的架构模式实现关注点分离,并高效处理数据流与异步任务。MVVM(Model-View-ViewModel)架构是当前Android官方推荐的主流模式,它通过ViewModel管理UI相关数据,并利用LiveData或StateFlow实现数据驱动UI更新,极大地提升了代码的可测试性与可维护性。在实际工程中,网络请求、本地数据持久化与复杂的UI交互是常见挑战。通过集成Retrofit和OkHttp可以构建稳健的网络层,而R

weixin_30653023的博客 436
上一篇: Paho MQTT 嵌入式c客户端研究笔记 (二)
下一篇: Android App 架构设计
rocky-bull
博客等级 码龄17年 70粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值