Android面试题-----SharedPreferences的底层实现是什么?SharedPreferences是否支持多线程?

本文详细解析了SharedPreferences的工作原理,包括数据的读取与保存流程,探讨了commit()与apply()的区别,并介绍了如何通过同步机制使其支持多线程操作。此外,还概述了Android的五种数据存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出处:2019年某司秋招题
问题链接:本人在笔试中遇到的,不便透露公司
参考文章:https://blog.youkuaiyun.com/wk_beicai/article/details/78523449

                  https://www.cnblogs.com/mzhou/p/3941008.html
------------------------------------------------------------   我的理解 ----------------------------------------------------------------

1.   SharedPreferences的内部工作原理如下:

       (1)getSharedPreferences()在创建一个SharedPreferences,会先判断是否有对应的xml文件(SharedPreferences存储数据的保存格式),如果存在则会有一个预加载操作,这个操作将把xml文件的内容通过I/O操作和xmlUtil解析后保存在一个map对象中。如果不存在则会创建一个对应的xml。

       (2)而在对数据进行读取时,是从内存中该map对象中进行读取;

       (3)在使用SharedPreferences保存数据时,主要分为以下两步:把数据先写入内存,写到map集合中将数据写到硬盘文件保持一致性;由此可以得出,数据在保存的时候,是以key-value的格式保存在xml文件中

       (4)写完数据后,要对写入的数据进行提交保存,主要有以下两种方式:

                        a.  commit():线程安全,性能慢,一般在当前线程完成文件操作,会有返回值;

                        b.  apply():线程不安全,性能高,异步处理I/O操作,一般在singleThreadExecutor中执行,没有返回值

 

2.   SharedPreferences根据官方文档说明,是不支持多线程的,而且也不是线程安全的,但是我们可以通过实现SharedPreferences接口来支持多线程操作,主要实现代码如下:

private static final class SharedPreferencesImpl implements SharedPreferences {
...
    public String getString(String key, String defValue) {
        synchronized (this) {
            String v = (String)mMap.get(key);
            return v != null ? v : defValue;
        }
   }
...
    public final class EditorImpl implements Editor {
        public Editor putString(String key, String value) {
            synchronized (this) {
                mModified.put(key, value);
                return this;
            }
        }
    ...
    }
}

延伸:

       (1)SharedPreferences只能保存Java基本数据类型(boolean、char、short、int、long、float、double),对于其他复杂数据类型,将通过base64编码成字符串进行保存。

       (2)Android提供了五种数据存储方式:

                        a.  ShardePreferences:存储目录为/data/data/<package name>/Shared_Pref

                        b.  文件存储数据:存储目录为/data/data/<package name>/files

                        c.  SQLite数据库存储数据:存储目录为/data/data/<package name>/database

                        d.  ContentProvider:统一了数据访问接口,需要用的类还有Uri、UriMatcher和ContentUris

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值