SharedPreferences
SharedPreferences
SharedPreferences 原理分析
SP 一创建就开始在后台加载数据了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private Map<String, Object> mMap;
private final File mFile;
SharedPreferencesImpl(File file, int mode) {
mFile = file;
mBackupFile = makeBackupFile(file);
mMode = mode;
mLoaded = false;
mMap = null;
mThrowable = null;
startLoadFromDisk();
}
private void startLoadFromDisk() {
synchronized (mLock) {
mLoaded = false;
}
new Thread("SharedPreferencesImpl-load") {
public void run() {
loadFromDisk();
}
}.start();
}
commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public boolean commit() {
MemoryCommitResult mcr = commitToMemory();
SharedPreferencesImpl.this.enqueueDiskWrite(
mcr, null /* sync write on this thread okay */);
try {
mcr.writtenToDiskLatch.await();
} catch (InterruptedException e) {
return false;
}
notifyListeners(mcr);
return mcr.writeToDiskResult;
}
SP 推荐实战
- 在工作线程中写入 sp 时,直接调用 commit 就可以,不必调用 apply, 这种情况下,commit 的开销更小
- 在主线程中写入 sp 时,不要调用 commit,要调用 apply
- sp 对应的文件尽量不要太大,按照模块名称去读写对应的 sp 文件,而不是一个整个应用都读写一个 sp 文件
- sp 的适合读写轻量的、小的配置信息,不适合保存大数据量的信息,比如长串的 json 字符串
- 当有连续的调用 PutXxx 方法操作时(特别是循环中),当确认不需要立即读取时,最后一次调用 commit 或 apply 即可
本文由作者按照 CC BY 4.0 进行授权