文章

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 推荐实战

  1. 在工作线程中写入 sp 时,直接调用 commit 就可以,不必调用 apply, 这种情况下,commit 的开销更小
  2. 在主线程中写入 sp 时,不要调用 commit,要调用 apply
  3. sp 对应的文件尽量不要太大,按照模块名称去读写对应的 sp 文件,而不是一个整个应用都读写一个 sp 文件
  4. sp 的适合读写轻量的、小的配置信息,不适合保存大数据量的信息,比如长串的 json 字符串
  5. 当有连续的调用 PutXxx 方法操作时(特别是循环中),当确认不需要立即读取时,最后一次调用 commit 或 apply 即可
本文由作者按照 CC BY 4.0 进行授权