Android存储基础及相关源码
16lz
2021-01-23
原文
Key-Value(SharedPreference):
- getPreferences()是Activity的接口,getSharedPreferences()是Context。前者是以Activity.getLocalClassName()为Key的
public SharedPreferences More ...getPreferences(int mode) { return getSharedPreferences(getLocalClassName(), mode);}
,也就是说不能跨Activity共享
- 源码中会检查文件是否被他人更改,标准是时间戳或大小有变化:
stat = Os.stat(mFile.getPath());return mStatTimestamp != stat.st_mtime || mStatSize != stat.st_size;
- onChangeListener是放到一个WeakHashMap里的
- new 一个SharedPreferences时会启动一个线程读文件,并上锁,对get、edit等操作形成阻塞
- 如果在get之前没有load完成,会阻塞UI线程
- apply和commit等任务实际上是串行的,一个过长可能会阻塞后面的
- apply和commit都会写回文件,但是apply是异步的,commit是同步的,而且commit运行在UI线程
- 对于没有apply或commit的改变是单独存在一个Map中的,不会影响get
- 所有editor的同步锁对象都是当前editor,也就是说,不同editor的修改是无序的,只有commit、apply的锁对象是SharedPreference,是有序的
- SharedPreference没有使用更高级的锁,基本上可以认为文件操作上使用synchronized块就ok了
File
- 机身内部存储是ext4格式,sd卡(包括机身内置的)是fat32格式。文件数多时,内部存储要比外部存储快很多。甚至使用仿ext4寻址方式的大文件存储小文件要比fat32直接存储要快(微信)
- 卸载时,仅使用getExternalFilesDir()得到的外部存储文件会被清除
- 相关文件地址:
- getFilesDir:/data/data/package/files
- getCacheDir: /data/data/package/cache
- getObbDir: /sdcard/Android/obb/package—游戏数据包
- getDatabasePath: /data/data/package/databases
- getDir: /data/data/package/filename
- getExternalCacheDir: /sdcard/Android/data/package/cache
- getExternalFilesDir: /sdcard/Android/data/package/files/type
Sqlite
- 数据库结构是由Schema(create table语句)确定的,每次load数据库都会构建Schema,所以分表可能会导致load过慢(微信)
- 官方建议在创建Table的时候,同时构建一个contract类,把所有的常量都存起来,结构像R文件一样
- getWritableDatabase()、getReadableDatabase()是运行很长一段时间的,所以应该在非UI线程中执行
- 对于某一列,如果没有设值,会插入NULL,如果设置null了,则不会插入
- 尽量不要使用rawquery方法,而是使用相应的函数,尽量避免注入
更多相关文章
- 总结android中的.gradle文件写法及含义
- [Android Studio] 使用本地 aar 文件
- Android Studio 实时显示布局文件Preview窗口
- Android 学习 之 资源文件 动态修改strings.xml中的字符资源
- Android中通过其他线程更新主线程UI
- Android初始化OpenGL ES,并且分析Renderer子线程原理