问题来源:
在项目开发中部分接口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
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦