首页 > 其他分享 >安卓之缓存的应用场景以及各种技术优劣分析

安卓之缓存的应用场景以及各种技术优劣分析

时间:2024-01-12 13:33:31浏览次数:31  
标签:缓存 String 优劣 安卓 内存 key import public


文章摘要

        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。

一、引言

        在当今的应用程序开发中,缓存技术已成为提高应用程序性能和响应速度的重要手段。安卓作为全球最流行的移动操作系统之一,其应用程序的缓存技术也备受关注。本文将重点分析安卓开发中的缓存技术及其应用场景,并探讨各种缓存技术的优劣。

二、应用场景

2.1、图片加载与显示

        当用户滚动社交媒体时间线或浏览商品列表时,通过内存缓存(如LruCache)和磁盘缓存(如DiskLruCache或使用Picasso、Glide等库的内置缓存机制)保存已加载过的图片资源,避免重复从服务器下载。

2.2、API响应数据缓存

        对于不频繁变动的数据(如新闻详情、用户信息等),在网络请求结果成功获取后将其存储在本地数据库或文件系统中作为缓存,当用户再次访问同一内容时,首先检查缓存并优先展示,减少不必要的网络交互。

2.3、离线内容访问

        为用户提供离线阅读或观看功能,例如将文章、视频或其他内容预先缓存到设备上,让用户在网络连接不稳定或无网络环境下仍能正常访问。

2.4、搜索历史记录

        在搜索框中缓存用户的搜索关键词,实现快速联想提示或历史查询记录回显。

2.5、用户配置和偏好设置

        使用SharedPreferences或者SQLite数据库缓存用户的个性化设置,确保即使在离线状态下也能维持一致的界面风格和操作习惯。

2.6、地图数据预加载

        地图应用可以提前下载并缓存附近区域的地图数据、POI信息等,提高地图浏览和导航的流畅度。

2.7、应用程序启动速度优化

        首次打开应用时加载的基础数据可以被缓存起来,后续启动时直接读取缓存数据,加快启动速度。

2.8、网络请求的HTTP缓存

        根据HTTP协议标准,利用OkHttp等网络库提供的HTTP缓存功能,根据响应头中的Cache-Control、ETag等字段自动处理缓存策略,从而减少不必要的网络请求。

2.9、游戏资源加载

        游戏中的大量静态资源如图像、音频、关卡数据等可以在首次加载后存储在本地缓存,后续游戏过程直接读取本地资源,提高游戏运行效率。

        以上场景只是缓存在Android应用中的一部分应用示例,实际上,任何需要临时存储、快速访问、降低IO开销的情况都可能用到缓存技术。

三、缓存技术优劣分析

3.1、内存缓存

        在Android应用开发中,内存缓存主要指的是将数据存储在设备RAM中的缓存机制,以实现快速访问和减少重复计算或网络请求的目的。常见的内存缓存主要包括以下几种类型:

        LruCache:LruCache 是一种基于 LRU(Least Recently Used,最近最少使用)算法的缓存实现,用于存储可回收的对象。它被用来替代 HashMap 作为 View 的缓存。LruCache 能够根据对象的引用情况进行回收,当缓存满时,会自动删除最久未使用的对象。

        SoftReference / WeakReference缓存:Java中提供了软引用(SoftReference)和弱引用(WeakReference)来间接实现内存缓存。当系统内存紧张时,这些引用关联的对象可能被垃圾回收器清理掉,但它们的生存期比强引用更短,适合用于缓存非关键性资源。

        自定义数据结构缓存:开发者可以根据需求使用HashMap、LinkedHashMap等数据结构自行构建内存缓存系统,并实现缓存淘汰策略,如LFU(Least Frequently Used)、FIFO(First In First Out)等。

        Bitmap Pool缓存:在处理图像资源时,Android中有专门针对Bitmap对象的内存缓存池,如 Glide 和 Picasso 库内部就实现了这样的功能,通过复用已解码的Bitmap来节省内存开销。

        View Holder缓存:在RecyclerView或其他列表组件中,ViewHolder模式也是一种内存缓存形式,它缓存了已经创建过的视图组件实例,避免每次滚动列表时频繁地重新创建和绑定视图。

3.1.1、优点

        速度快,数据存取效率高

3.1.2、缺点

        受限于内存大小,一旦内存不足,缓存的数据可能会被清除。

        适用于小量数据的缓存。

3.2、磁盘缓存

        磁盘缓存是一种持久化存储机制,用于将数据保存在设备的内部或外部存储空间中。相比于内存缓存,磁盘缓存可以存储更多的数据且不受进程生命周期影响,但读写速度较慢。

        磁盘缓存主要包括以下几种形式:

        文件系统缓存:最简单的一种缓存方式,直接将数据写入文件系统。简单易用,但不易管理,容易造成文件碎片化,影响性能。

        数据库缓存:使用SQLite等数据库来存储缓存数据。可以实现数据持久化,易于管理,但需要额外的数据库操作,性能相对较低。

        第三方缓存库:如Google的DiskLruCache等。易于使用和管理,提供丰富的API和功能,但可能需要引入第三方依赖。

3.2.1、优点

        存储空间大,可以存储大量数据,数据持久化;

3.2.2、缺点

        速度较慢,因为涉及到磁盘读写操作,需要额外的磁盘空间。

3.3、网络缓存

3.3.1、优点

        灵活配置缓存策略,例如设置缓存有效期、缓存大小等,可以实现网络请求的优化,减少对网络的依赖;

3.3.2、缺点

        需要额外的配置和代码实现,对于非网络请求的场景可能不太适用。

四、代码示例

4.1、LruCache

        以下是一个使用LruCache实现图片内存缓存的示例代码:

import android.graphics.Bitmap;
import android.util.LruCache;

public class ImageMemoryCache {
    private LruCache<String, Bitmap> mMemoryCache;

    public ImageMemoryCache(int maxSize) {
        // 初始化LruCache,设置最大缓存大小为maxSize(单位:字节)
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        int cacheSize = maxMemory / 8; // 使用总内存的1/8作为缓存大小
        mMemoryCache = new LruCache<>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                // 计算单个条目的大小(这里假设Bitmap占用的内存按像素点数计算)
                return value.getRowBytes() * value.getHeight() / 1024;
            }
        };
    }

    public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

    public Bitmap getBitmapFromMemCache(String key) {
        return mMemoryCache.get(key);
    }
}

4.2、SQLite

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class CacheDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "cache.db";
    private static final int DATABASE_VERSION = 1;

    public CacheDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE IF NOT EXISTS CacheData (_id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT, value TEXT)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
    }

    public void put(String key, String value) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("key", key);
        contentValues.put("value", value);
        db.insert("CacheData", null, contentValues);
        db.close();
    }

    public String get(String key) {
        String value = null;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query("CacheData", new String[]{"value"}, "key = ?", new String[]{key}, null, null, null);
        if (cursor.moveToFirst()) {
            value = cursor.getString(0);
        }

        if(cursor != null) cursor.close();
        db.close();
        
        return value;
    }
}

4.3、OkHttp

在build.gradle中引入依赖。

implementation 'com.squareup.okhttp3:okhttp:4.9.0'

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpCache {
    public OkHttpCache(File cacheDirectory, Long cacheSize) {
        // 创建一个OkHttpClient实例并配置缓存大小和过期时间等参数。
        OkHttpClient client = new OkHttpClient.Builder()
                .cache(new Cache(cacheDirectory, cacheSize)) // 指定缓存目录和大小限制。
                .build();

        //使用OkHttp发送HTTP请求时,会自动使用配置的缓存机制进行数据获取和处理。
        Request request = new Request.Builder()
                .url("http://example.com") // 设置请求的URL。
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 处理请求失败的情况。
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                } else {
                    // 处理响应数据,可以从response.body()获取响应体。
                }
            }
        });
    }
}

五、结论

        在安卓开发中,选择合适的缓存技术对于提高应用程序性能和响应速度至关重要。内存缓存适用于小量数据的快速存取;磁盘缓存适用于大量数据的持久化存储;而网络缓存则适用于网络请求的优化。在实际开发中,应根据具体需求选择合适的缓存技术,并充分考虑其优缺点。通过合理配置和应用缓存策略,可以提高应用程序的性能和用户体验。

标签:缓存,String,优劣,安卓,内存,key,import,public
From: https://blog.51cto.com/u_16423321/9216033

相关文章

  • 安卓仿微信朋友圈动态数据加载(包括评论和点赞,以及动态详情页)
    在项目里面使用到了类似微信朋友圈的功能,所以就研究了一下,大家先看看效果吧!效果图一:效果图二:效果图三:效果图四:效果图五:效果图六:效果图七:效果图八:......
  • 安卓之缓存的应用场景以及各种技术优劣分析
    ​文章摘要        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。一、引言        在当......
  • 安卓逆向 -- 关键代码定位与分析技术
    在安卓逆向工程中,定位和分析关键代码是整个逆向过程中的一项核心任务,它涉及到多个步骤,包括抓包分析、加固检测、开发形式分析、关键代码定位、以及算法还原。以下是一步步的技术博客,介绍如何进行高效的安卓逆向工程。1.抓包分析与加密字段识别首先,我们需要通过网络抓包工具(例如Wir......
  • 缓存之美——如何选择合适的本地缓存?
    1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffine以及自称在Java中使用最广泛的EhC......
  • 缓存之美——如何选择合适的本地缓存?
    1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffine以及自称在Java中使用最广泛的EhCac......
  • 手持终端PDA定制_5G安卓手持机|手持终端设备PDA解决方案
    手持终端PDA在商业和工业等领域有着广泛的应用,因其内置一维码/二维码扫码功能,可满足门票管理、零售、智能巡检、仓储物资管理、金融、快递等不同行业的需求。这款手持终端基于MT6877方案,搭载了八核处理器(2xCortex-A782.4GHz+6xCortex-A552.0GHz),性能较前代产品提升40......
  • 安卓开发板_基于联发科MTK8788平台平板电脑_安卓智能硬件定制
    联发科MT8788安卓核心板平台介绍:MTK8788设备具有集成的蓝牙、fm、wlan和gps模块,是一个高度集成的基带平台,包括调制解调器和应用处理子系统,启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARMCortex-A73、最高可达2.0GHz的ARMCortex-A53和功能强大的多标准视频编......
  • .NET Core MemoryCache缓存批量获取Key或者删除
    .NetCore下使用缓存,除了大家耳熟能详的Redis做分布式缓存外,本地内存缓存也会一起结合来使用,它存取更快,使我们的应用达到极致性能要求。这也是我们经常提到的3级或者4级缓存,每一层都有自己的使用场景,优缺点,结合业务特点来选择合适的才是王道。这里我们就使用Net原生的Microsoft......
  • 安卓之从视频中提取音频的应用场景及技术优劣分析
    引言随着移动设备性能的不断提升和多媒体内容的广泛传播,从视频中提取音频已成为众多开发者与用户日常操作的一部分。在安卓平台上,这项技术经历了从早期的复杂专业工具到现今便捷易用的应用程序的演变过程。本文旨在探讨安卓系统中视频转音频(VideotoAudioExtraction,VAE)技术的发......
  • 安卓之从视频中提取音频的应用场景及技术优劣分析
    引言随着移动设备性能的不断提升和多媒体内容的广泛传播,从视频中提取音频已成为众多开发者与用户日常操作的一部分。在安卓平台上,这项技术经历了从早期的复杂专业工具到现今便捷易用的应用程序的演变过程。本文旨在探讨安卓系统中视频转音频(VideotoAudioExtraction,VAE)技......