2015-10-29 45 views
4

我正在使用SharedPreferences在用戶的數據中保存我的應用程序。 我知道commit()apply()方法之間的區別,但我注意到commit()返回如果新值已成功寫入永久存儲器apply()沒有。SharedPreferences何時應用()和提交()失敗?

什麼原因可能導致commit()方法返回false或apply()方法失敗?

回答

4

讓我們來看看the source code for commit()

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; 
    } 

換句話說,commit()將返回false,如果線程被中斷,而等待磁盤寫操作完成,或如果由於某種原因磁盤寫入失敗(很可能是因爲磁盤已滿)。

+0

好的,謝謝你現在更清楚。這是否必須做你的整體手機可用內存,還是更像是一個專門分配給這個應用程序的內存?如果你的手機內存已滿,更可能失敗,我只是漫遊。 –

+1

這將是存儲APK和應用專用數據的用戶/數據分區的磁盤利用率。根據設備(我認爲),這可能是與「內部存儲」共享的分區,即照片和內容。 AFAIK,沒有每個應用限制。 –