SharedPreferences在一个现有应用中无法正常工作.我尝试了很多不同的方法,但仍然没有工作.始终获取默认值app start.
当我在创建的新应用程序中使用相同的代码时,它正在工作.
它正在运行所有其他现有应用程序.
你知道为什么吗?
String default_user = "Default_User"; SharedPreferences pref = this.getSharedPreferences("TEST_SHAREDPREF", MODE_PRIVATE); String user = pref.getString("user", default_user); Log.d("SHARED CHECK", user); if (user.equals(default_user)) { SharedPreferences.Editor edit = pref.edit(); edit.putString("user", "new_user"); boolean ok = edit.commit(); user = pref.getString("user", default_user); Log.d("SHARED WRITE", user); Toast.makeText(this, user + " Save process: " + ok, Toast.LENGTH_LONG).show(); } else { Log.d("SHARED READ", user); Toast.makeText(this, "READ SharedPrefs: " + user, Toast.LENGTH_LONG).show(); }
编辑:记录结果
该块总是返回这个不正确的应用程序,我不知道为什么
//first run SHARED CHECK Default_User SHARED WRITE new_user //each time after first SHARED CHECK Default_User SHARED WRITE new_user
该块始终返回此所有应用程序
//first run SHARED CHECK Default_User SHARED WRITE new_user //each time after first SHARED CHECK new_user SHARED READ new_user
Ernir Erling.. 8
当您调用apply()
或commit()
更改首次保存到应用程序的内存缓存中,然后Android会尝试将这些更改写入磁盘.这里发生的事情是您的commit()
调用在磁盘上失败,但仍然会对应用程序的内存缓存进行更改,如源中可见.
从SharedPreferences中读取值是不够的,因为该值可能不会反映磁盘上的真实值,而只会反映存储在内存缓存中的值.
您未能做的是检查从commit()
调用返回的布尔值,对于您的问题情况可能是错误的.commit()
如果返回false,您可以重试几次.
当您调用apply()
或commit()
更改首次保存到应用程序的内存缓存中,然后Android会尝试将这些更改写入磁盘.这里发生的事情是您的commit()
调用在磁盘上失败,但仍然会对应用程序的内存缓存进行更改,如源中可见.
从SharedPreferences中读取值是不够的,因为该值可能不会反映磁盘上的真实值,而只会反映存储在内存缓存中的值.
您未能做的是检查从commit()
调用返回的布尔值,对于您的问题情况可能是错误的.commit()
如果返回false,您可以重试几次.
只需使用以下方法并检查.
创建一个Java
类AppTypeDetails.java
import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; public class AppTypeDetails { private SharedPreferences sh; private AppTypeDetails() { } private AppTypeDetails(Context mContext) { sh = PreferenceManager.getDefaultSharedPreferences(mContext); } private static AppTypeDetails instance = null; public synchronized static AppTypeDetails getInstance(Context mContext) { if (instance == null) { instance = new AppTypeDetails(mContext); } return instance; } // get user status public String getUser() { return sh.getString("user", ""); } public void setUser(String user) { sh.edit().putString("user", user).commit(); } // Clear All Data public void clear() { sh.edit().clear().commit(); } }
现在将值设置为SharedPreferences
.
AppTypeDetails.getInstance(MainActivity.this).setUser();
获取价值表格SharedPreferences
.
String userName = AppTypeDetails.getInstance(MainActivity.this).getUser();
现在使用userName做任何事情.
经常检查
if(userName.trim().isEmpty()) { // Do anything here. }
因为在SharedPreferences
我们设置用户名为空("")
要么
你可以设置用户名为null SharedPreferences
然后你需要检查
if(userName != null){ //do anything here }
对于明确的数据SharedPreferences
.
AppTypeDetails.getInstance(MainActivity.this).setUser("");
要么
AppTypeDetails.getInstance(MainActivity.this).clear();