问题来源:
在项目开发中部分接口token显示为空,最终导致用户无法使用,而我们的token都是在获取之放到缓存中的,代码反复检查也没有发现问题的解决办法,最后查阅资料把问题根源锁定到SharePreferences缓存的上,
public class SpUtils { private static final String spFileName = "app"; //使用SharedPreferences public static String getString(Context context, String strKey) { SharedPreferences setPreferences = context.getSharedPreferences( spFileName, Context.MODE_PRIVATE); String result = setPreferences.getString(strKey, ""); return result; } public static String getString(Context context, String strKey, String strDefault) { SharedPreferences setPreferences = context.getSharedPreferences( spFileName, Context.MODE_PRIVATE); String result = setPreferences.getString(strKey, strDefault); return result; } public static void putString(Context context, String strKey, String strData) { SharedPreferences activityPreferences = context.getSharedPreferences( spFileName, Context.MODE_PRIVATE); SharedPreferences.Editor editor = activityPreferences.edit(); editor.putString(strKey, strData); editor.commit(); } }
我平时代码中创建的SharedPreferences文件的类型都是MODE_PRIVATE
Mode的不同类型所代表的含义:
MODE_PRIVATE:代表私有访问模式,在Android 2.3及以前这个访问模式是可以跨进程的,之后的版本这个模式就只能访问同一进程下的数据.
MODE_MULTI_PROCESS:在Android 2.3及以前,这个标志位都是默认开启的,允许多个进程访问同一个SharedPrecferences对象。而Android 2.3以后的版本,须将MODE_MULTI_PROCESS这个值传递给mode参数,才能开启多进程访问。
MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取
MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入
细细分析出现token为空的的地方都是可能出现跨进程操作的地方,在Android 2.3及以前情况会出现一个进程未执行完,就进行了另一个进程,导致缓存数据丢失
解决办法:
1.token在获取之后保存到数据库中,在使用token的地方先到缓存中查询,缓存不存在,再到数据库查询
2.MODE的类型由MODE_PRIVATE变成MODE_MULTI_PROCESS