Adnroid 数据存储:SharedPreferences详解【SharedPreferencesUtils,SharedPreferences的ANR】

news2024/12/26 11:19:42

目录

1)SP是什么、如何使用,SPUtils
2)SP的流程
3)comit和apply

一、SP是什么,如何使用,SPUtils


1.1 SP是什么?

SharedPreferences是Android平台提供的一种轻量级的数据存储方式,用于保存和读取应用程序的配置信息或其他简单的键值对数据。

使用SharedPreferences有以下几个优点:

  1. 简单易用:SharedPreferences提供了简单的API来保存和读取数据,无需编写复杂的数据库操作代码。
  2. 轻量级:相比于SQLite数据库等其他数据存储方式,SharedPreferences更加轻量级,适合存储少量的配置信息或用户偏好设置。
  3. 高效快速:由于数据存储在内部存储空间中,访问速度较快,适合存储需要频繁读取的数据。
  4. 跨进程共享:SharedPreferences可以被多个组件或进程共享访问,方便不同组件之间的数据交互和共享配置信息。
  5. 自动持久化:SharedPreferences会自动将数据持久化到磁盘上,即使应用关闭后再次启动也能保留之前的数据。

1.2 SP如何使用?

  1. 获取SharedPreferences实例:
val sharedPreferences = context.getSharedPreferences("my_preferences", Context.MODE_PRIVATE)
  1. 读取数据:
使用getString()方法读取String类型的值:val value = sharedPreferences.getString("key", "default_value")

使用getInt()方法读取Int类型的值:val value = sharedPreferences.getInt("key", default_value)
  1. 写入数据:
使用edit()方法获取SharedPreferences.Editor实例:val editor = sharedPreferences.edit()
使用putString()方法写入String类型的值:editor.putString("key", "value")
使用putInt()方法写入Int类型的值:editor.putInt("key", value)
  1. 提交或应用更改:
使用commit()方法提交更改:editor.commit()

使用apply()方法应用更改(异步操作):editor.apply()

1.3 SPUtils

public class SharedPreferencesUtils {
    /**
     * 保存在手机里面的文件名
     */
    private static final String FILE_NAME = "share_date";


    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     * @param key
     * @param object
     */
    public static void setParam(String key, Object object){

        String type = object.getClass().getSimpleName();
        SharedPreferences sp = MyApplication.getContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if("String".equals(type)){
            editor.putString(key, (String)object);
        }
        else if("Integer".equals(type)){
            editor.putInt(key, (Integer)object);
        }
        else if("Boolean".equals(type)){
            editor.putBoolean(key, (Boolean)object);
        }
        else if("Float".equals(type)){
            editor.putFloat(key, (Float)object);
        }
        else if("Long".equals(type)){
            editor.putLong(key, (Long)object);
        }

        editor.commit();
    }


    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getParam(String key, Object defaultObject){
        String type = defaultObject.getClass().getSimpleName();
        SharedPreferences sp = MyApplication.getContext().getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);

        if("String".equals(type)){
            return sp.getString(key, (String)defaultObject);
        }
        else if("Integer".equals(type)){
            return sp.getInt(key, (Integer)defaultObject);
        }
        else if("Boolean".equals(type)){
            return sp.getBoolean(key, (Boolean)defaultObject);
        }
        else if("Float".equals(type)){
            return sp.getFloat(key, (Float)defaultObject);
        }
        else if("Long".equals(type)){
            return sp.getLong(key, (Long)defaultObject);
        }

        return null;
    }





}

二、SP的流程


1)首先SP使用的是xml格式保存数据(如下图),文件位于应用的私有存储空间中【在/data/data/<package_name>/shared_prefs/目录下】。

2) SharedPreferences在读取xml文件时,会把整个xml文件加载到内存中,并以DOM的形式进行解析。

3)当新增一个K-V时,写入磁盘是全量更新,即会把之前的文件再次更新一遍。这意味着如果我们有100个数据,
如果只更新一项数据,也需要将所有数据转化成xml格式,然后再通过io写入文件中,这也就是导致使用SP可能存在ANR的情况出现。

在这里插入图片描述

三、comit和apply


SharedPreferences的commit()和apply()方法都用于提交对数据的修改

commit()方法:

    commit()方法是同步地将修改集合中的数据写入磁盘。
    它会阻塞当前线程直到写入操作完成,并返回一个boolean值表示是否成功。
    如果写入过程中发生异常或失败,commit()方法会抛出异常并返回false

对于SharedPreferences的commit()方法,由于它是同步的,会在主线程中执行写入操作。如果数据量较大或者磁盘IO速度较慢,可能会导致阻塞主线程,从而引发ANR错误。

apply()方法:

    apply()方法是异步将修改集合中的数据写入磁盘。
    它不会阻塞当前线程,而是立即返回。
    写入在后台线程中进行,因此不会影响主线程的执行。
    apply()方法没有返回值,也不会抛出异常,所以无法知道写入操作是否成功。

不过,apply也会导致ANR问题,具体可以看上面的源码, apply 其实利用了CountDownLatch机制,阻塞了当前线程,后续 Activity 的onStop()中会将这里的awaitCommit取出来执行,即UI线程会阻塞等待sp文件写入磁盘,为什么等待?为了保证异步任务及时完成。所以我们有的时候可以看到退出一个页面的时候,感觉也会卡,因为阻塞了主线程。

总结:SP,不能存储太多的信息,或者按分类去加载存储,很小很简单的数据可以保存到SP里面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux SQLite数据库】一、SQLite交叉编译与移植

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎&#xff0c;它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机和计算机上运行&#xff0c;它被嵌入到无数人每天都在使用的众多应用程序中。此外&#xff0c;SQLite 还具有稳定…

git push上不去的问题Iremote reiectedl——文件过大的问题

在新建分支的时候&#xff0c;发现push怎么也上传不上去&#xff0c;一开始觉得是权限的问题&#xff0c;但是尝试了各种方案都没有用&#xff0c;后面再仔细看了一下是文件太大了&#xff0c;远程拒绝推送 接下来&#xff0c;和大家讲讲我的解决方案 1、把修改的代码迁移到新…

将QT工程打包生成可单独运行的.exe程序

将QT工程打包生成可单独运行的.exe程序 1、生成exe文件2、导入qt配置文件3、打包qt配置文件和exe文件4、单个可执行exe文件 1、生成exe文件 Qt中执行Release操作&#xff0c;生成对应的exe文件。 Release的路径下会生成如下文件&#xff1a; 进入release文件夹&#xff0c;双…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

应急响应:D盾的简单使用.

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 D盾功…

PLL基本原理、设计及应用

PLL基本原理 锁相环&#xff08;Phase-Locked Loop, PLL&#xff09;是一种基本的反馈控制系统&#xff0c;广泛应用于电子通信、信号处理、时钟同步等多个领域。PLL通过反馈机制锁定输入信号的频率和相位&#xff0c;从而实现输出信号与输入信号的同步。其基本工作原理可以概…

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…

vue路由学习

1、基本了解 &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;在创建vue项目时&#xff0c;就已经勾选了vue-router 2、 &#xff08;0&#xff09;自己手写了一个新的组件文件(部门管理)&#xff08;DeptView.vue&#xff09; &#xff08;1&a…

金坛网报道数学应用研讨会在坛开幕,赛氪做协办单位出席参加

2024年8月5日-7日&#xff0c;由中国优选法统筹法与经济数学研究会和河海大学联合主办&#xff0c;百度、杉数科技、玻色量子、京东物流、赛氪网协办的第九届数学在企业中的应用研讨会在河海大学常州校区隆重开幕。此次研讨会旨在继承和发扬华罗庚先生倡导的数学与行业应用紧密…

LVS负载均衡+集群+三种工作模式+调度算法及实战案例

一、LVS 1.1简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩主导开发的开源负载均衡项目&#xff0c;目前&#xff0c;LVS已经被集成到Linux内核模块中。该项目实现了在基于IP的数据基础上&#xff0c;请求负载均衡调度方案&a…

如何将PDF文件压缩到最小?五个pdf压缩方法,一键将体积减小70%!

将pdf文件压缩得更小一点&#xff0c;不仅节省设备的存储空间&#xff0c;让电脑运行得更流畅&#xff0c;还有助于我们快速的将pdf文件分享给好友同事。 pdf压缩方法有很多&#xff0c;本文整理了几个关于电脑文件压缩的方法&#xff0c;适用于各个操作系统的电脑&#xff0c;…

已解决:VS2022安装插件提示重复,又卸载不掉的问题(”此扩展已经安装到所有适用的产品”)

本问题已得到解决&#xff0c;请看以下小结&#xff1a; 关于《VS2022扩展插件安装失败》的解决方案 记录备注报错时间2024年报错截图插件安装界面提示”此扩展已经安装到所有适用的产品”无截图 报错原因安装会扫描是否含有该插件&#xff0c;卸载则需要输入插件id解决步骤 第…

【精选】推荐6款AI网站推荐论文工具平台

在当前的学术研究和论文撰写过程中&#xff0c;AI写作工具已经成为许多学生和研究人员的重要助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助解决复杂的写作问题。以下是六款推荐的AI网站&#xff0c;它们在毕业论文写作中表现尤为出色。 一、千笔-AIPassPaper 千笔-…

循环神经网络六-Pytorch中的序列化器

目录 一.梯度消失 二.梯度爆炸 三.解决梯度消失或者爆炸 四序列化器 1.nn.sequential 2.nn.BatchNormld 3.nn.Dropout 一.梯度消失 假设我们由四层神经网络&#xff0c;每一次只有一个神经元X 那么在计算它的梯度的时候就有&#xff1a;▽w1 x1f(a1)’w2f(b1)’w3*▽ou…

向量新增的3种方式

本文介绍向量检索服务如何通过控制台、SDK、API三种不同的方式新增向量。 前提条件 已开通向量检索服务。如未开通&#xff0c;请先开通服务。 已创建Collection。 控制台方式 登录向量检索服务控制台。 在左侧导航栏单击Cluster列表&#xff0c;选中需要新增向量的Collecti…

创意设计师必看:9个强大的页面设计工具推荐

网页设计并不容易&#xff0c;实用的网页设计工具更难找到。随着网络的快速发展&#xff0c;网页迅速崛起&#xff0c;网页设计也很流行。本文收集了7种良知和实用的网页设计工具&#xff0c;每一种都受到网页设计师的青睐&#xff0c;以确保易于使用和使用。我希望它能帮助你提…

leetcode53_最大子数组和

思路 动态规划 dp 数组&#xff1a;dp[i] 代表已元素nums[i]结尾的连续子数组的最大和 func maxSubArray(nums []int) int {dp : make([]int, len(nums))dp[0] nums[0]ans : nums[0]for i:1; i < len(nums); i {if dp[i-1] < 0 {dp[i] nums[i]}else{dp[i] dp[i-1] …

mysql8.4.2数据库做主从复制

linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包-CSDN博客文章浏览阅读472次&#xff0c;点赞7次&#xff0c;收藏4次。linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包https://blog.csdn.net/xikui1551/article/de…

对象字面量

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

nuxt 重构已有vue项目使用心得

用现有的vue-cli 项目 改成 nuxt 项目 真的是废了 好大的劲 因为之前的项目是中大型项目 重新改成html css 可能废很大工作量这次采用nuxt 框架来重新构架 因为2个项目都是基于vue 编写 1.将之前的src 文件夹 整个拖进去 在nuxt.config.js 引入 srcDir: "src/" 2.…