應(yīng)用SharedPreferences在進(jìn)程之間通信時(shí)你會(huì)遇到的問題

應(yīng)用SharedPreferences在進(jìn)程之間通信時(shí)你會(huì)遇到的問題
出現(xiàn)這樣一個(gè)問題:先啟動(dòng)主線程并獲取SharedPreferences對(duì)象,然后對(duì)值進(jìn)行修改,然后再啟動(dòng)其它進(jìn)程并獲取SharedPreferences對(duì)象,能夠獲取修改后的值,但此時(shí)如果對(duì)此值進(jìn)行修改,均不能對(duì)其他進(jìn)程產(chǎn)生作用。必須等到進(jìn)程重啟或者app重啟才能與其他進(jìn)程進(jìn)行數(shù)據(jù)同步。

原因:只有在創(chuàng)建SharedPreferences對(duì)象的時(shí)候才會(huì)從磁盤中國進(jìn)行讀取,讀取完以后值保存在內(nèi)存(HashMap)當(dāng)中,下次獲取SharedPreferences對(duì)象優(yōu)先從緩存當(dāng)中獲取,所以在當(dāng)前進(jìn)程修改了SharedPreferences的值,其他進(jìn)程的SharedPreferences對(duì)象的值并不會(huì)改變。只有把當(dāng)前另外的進(jìn)程關(guān)閉(如:關(guān)閉手機(jī)、或殺死該app重新進(jìn)入),再次創(chuàng)建進(jìn)程時(shí)才會(huì)重新從磁盤中再次讀取文件。

源碼分析:通常我們獲取SharedPreferences都是通過Context中的getSharedPreference方法來獲取SharedPreferences對(duì)象,在Context中,getSharedPreference方法是一個(gè)抽象方法,沒有具體實(shí)現(xiàn)。我們知道Context的實(shí)現(xiàn)類是ContextImpl,所以直接找到ContextImpl的getSharedPreference方法??梢钥吹?,這里將SharedPreferences的實(shí)例對(duì)象SharedPreferencesImpl的先通過Map緩存起來,以后每次獲取如果內(nèi)存已經(jīng)存在,那么直接返回,如果不存在才會(huì)重新創(chuàng)建。

那么為什么在同一個(gè)進(jìn)程SharedPreferences應(yīng)用又沒有問題呢?
這是由于Editor 的實(shí)現(xiàn)類EditorImpl,但我們修改完SharedPreferences對(duì)象之后都會(huì)調(diào)用commit(直接當(dāng)錢線程執(zhí)行)或者apply方法(將當(dāng)前任務(wù)加到線程池中,后臺(tái)執(zhí)行)才會(huì)執(zhí)行保存,在源碼中可以看到無論調(diào)用哪一個(gè)方法都會(huì)調(diào)用commitToMemory()和enqueueDiskWrite方法。commitToMemory()方法就是將值提交到內(nèi)存當(dāng)中。enqueueDiskWrite()將修改后的內(nèi)容寫入到磁盤當(dāng)中。所以下一次取出的值是正確的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本篇將從源碼角度帶大家分析一下Android中常用的輕量級(jí)數(shù)據(jù)存儲(chǔ)工具SharedPreferences,以及Sh...
    EoniJJ閱讀 4,073評(píng)論 22 26
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,813評(píng)論 11 349
  • 站起來 倒下去 都是人生體驗(yàn) 美在那里 苦在這里 放肆倔強(qiáng)總有結(jié)果吧
    火山wj閱讀 290評(píng)論 0 0
  • 有一只名叫懶惰的蟲子,它總是在我的心里爬呀爬,于是我便感覺抓心撓肝,于是我覺得奇癢難耐,可是我抓不住它,可是...
    王憶懿閱讀 168評(píng)論 0 0

友情鏈接更多精彩內(nèi)容