不废话,需求:缓存登录时的token,超过设置的存储时间就无效,怎么做?

使用ACache也可以设置缓存时间,但ACache在清缓存的时候会被清空。

SharedPreferences存储默认都是无时间限制的。

大概思路是,存储的时候记录当前时间,要存多久。取数据的时候判断这个数据已经存储了多久,如果超过设置的存储时间,就获取默认值。

1,首先,我们需要一个存储的model——SpSaveModelpublic class SpSaveModel implements Serializable{

private int saveTime;

private T value;

private long currentTime;

public SpSaveModel() {

}

public SpSaveModel(int saveTime, T value,long currentTime) {

this.saveTime = saveTime;

this.value = value;

this.currentTime=currentTime;

}

public long getCurrentTime() {

return currentTime;

}

public void setCurrentTime(long currentTime) {

this.currentTime = currentTime;

}

public int getSaveTime() {

return saveTime;

}

public void setSaveTime(int saveTime) {

this.saveTime = saveTime;

}

public T getValue() {

return value;

}

public void setValue(T value) {

this.value = value;

}

}

2,需要一个object和json字符串转换的工具,这里用fastJson,添加依赖compile 'com.alibaba:fastjson:1.1.26'

3,工具类import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.text.TextUtils;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.TypeReference;

/**

* Created by KID on 2018/5/3.

*/

public class SpUtils {

//保存时间单位

public static final int TIME_SECOND=1;

public static final int TIME_MINUTES=60*TIME_SECOND;

public static final int TIME_HOUR = 60 *TIME_MINUTES;

public static final int TIME_DAY = TIME_HOUR * 24;

public static final int TIME_MAX = Integer.MAX_VALUE; // 不限制存放数据的数量

public static final int DURATION_UNIT=1000;

private static final String fileName = "config";

private SharedPreferences sp;

private Editor editor;

private static SpUtils INSTANCE = null;

public static SpUtils getInstance(Context context) {

if (null == INSTANCE) {

INSTANCE = new SpUtils(context);

}

return INSTANCE;

}

private SpUtils(Context context) {

sp = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);

editor = sp.edit();

}

public void setString(String e, String value) {

SpSaveModelspSaveModel=new SpSaveModel<>(TIME_MAX,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

/**

*

* @param e 存放的key

* @param value 存放的value

* @param saveTime 缓存时间

*/

public void setString(String e, String value,int saveTime) {

SpSaveModelspSaveModel=new SpSaveModel<>(saveTime,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

/**

*

* @param e 存放的key

* @param defValue 该key不存在或者过期时,返回的默认值

* @return

*/

public String getString(String e, String defValue){

String json=sp.getString(e,"");

if(!TextUtils.isEmpty(json)){

SpSaveModelspSaveModel= JSON.parseObject(json, new TypeReference>(){});

if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){

return spSaveModel.getValue();

}

}

return defValue;

}

public void setInt(String e, int value) {

SpSaveModelspSaveModel=new SpSaveModel<>(TIME_MAX,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public void setInt(String e, int value,int saveTime) {

SpSaveModelspSaveModel=new SpSaveModel<>(saveTime,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public Integer getInt(String e, int defValue){

String json=sp.getString(e,"");

if(!TextUtils.isEmpty(json)){

SpSaveModelspSaveModel= JSON.parseObject(json, new TypeReference>(){});

if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){

return spSaveModel.getValue();

}

}

return defValue;

}

public void setBoolean(String e, boolean value) {

SpSaveModelspSaveModel=new SpSaveModel<>(TIME_MAX,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public void setBoolean(String e, boolean value,int saveTime) {

SpSaveModelspSaveModel=new SpSaveModel<>(saveTime,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public boolean getBoolean(String e, boolean defValue){

String json=sp.getString(e,"");

if(!TextUtils.isEmpty(json)){

SpSaveModelspSaveModel= JSON.parseObject(json, new TypeReference>(){});

if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){

return spSaveModel.getValue();

}

}

return defValue;

}

public void setLong(String e, long value) {

SpSaveModelspSaveModel=new SpSaveModel<>(TIME_MAX,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public void setLong(String e, long value,int saveTime) {

SpSaveModelspSaveModel=new SpSaveModel<>(saveTime,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

public long getLong(String e, long defValue){

String json=sp.getString(e,"");

if(!TextUtils.isEmpty(json)){

SpSaveModelspSaveModel= JSON.parseObject(json, new TypeReference>(){});

if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){

return spSaveModel.getValue();

}

}

return defValue;

}

public boolean isTimeOut(long saveCurrentTime,int saveTime){

return (System.currentTimeMillis()-saveCurrentTime)/DURATION_UNIT

}

public void set(String e, Object value,int saveTime) {

SpSaveModelspSaveModel=new SpSaveModel<>(saveTime,value,System.currentTimeMillis());

String json=JSON.toJSONString(spSaveModel);

editor.putString(e, json);

editor.commit();

}

}

4,使用public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.btn_save).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

save();

}

});

findViewById(R.id.btn_get).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

get();

}

});

}

//保存

private void save() {

//保存10秒

// SpUtils.getInstance(this).set("text","我的世界",10);

SpUtils.getInstance(this).setString("text","我的世界",10);

SpUtils.getInstance(this).setInt("num",123456,10);

SpUtils.getInstance(this).setBoolean("isBu",true,10);

}

//获取

private void get() {

String text=SpUtils.getInstance(this).getString("text","超时了");

int num=SpUtils.getInstance(this).getInt("num",-100);

boolean isBu=SpUtils.getInstance(this).getBoolean("isBu",false);

Log.e("kid","text======="+text);

Log.e("kid","num======="+num);

Log.e("kid","isBu======="+isBu);

}

}

PS:存的时候,不加存储时间,默认是永久

android sp缓存,Android sharedPreference设置缓存时间相关推荐

  1. Android sharedPreference设置缓存时间

    不废话,需求:缓存登录时的token,超过设置的存储时间就无效,怎么做? 使用ACache也可以设置缓存时间,但ACache在清缓存的时候会被清空.  SharedPreferences存储默认都是无 ...

  2. kodi android 卡顿,给Kodi设置缓存来解决播放大文件卡顿

    给Kodi设置缓存来解决播放大文件卡顿 2021-03-02 16:21:20 28点赞 355收藏 31评论 Kodi可以算是电视盒子上最棒的播放器了,它具有强大的功能,优美的界面,相信很多人也都是 ...

  3. solr 插入数据后变数组_理解Solr缓存及如何设置缓存大小

    为了得到最好的检索性能,Solr会在内存中缓存不同的数据: Result Set: 检索结果 Filter: filter query结果 Document Field: 文档的字段值 所以随后类似的 ...

  4. Android --- logcat 打印日志、设置缓存大小、过滤等

    一.示例: setprop persist.log.tag -G setprop persist.log.tag V setprop persist.log.tag S setprop persist ...

  5. 基于springboot2.x集成缓存注解及设置过期时间

    添加以下配置信息: /*** 基于注解添加缓存*/ @Configuration @EnableCaching public class CacheConfig extends CachingConf ...

  6. android系统应用程序设置时间,Android应用程序设置系统时间的方法

    Android应用程序获取系统时间的方法: System.currentTimeMillis(); Android SDK虽然提供了设置系统时间的方法SystemClock.setCurrentTim ...

  7. 腾讯视频如何设置缓存画质和个数

    腾讯视频如何设置缓存画质和个数 我们在使用腾讯视频缓存的时候可以更改缓存的画质和缓存个数,下面几步教你操作! 1.在手机上直接打开腾讯视频APP 2.进入个人中心,点击设置 3.在设置中,点击缓存清晰 ...

  8. Android 系统(11)---android 系统权限大全

    收集到的android权限都很实用的(permission)大全 1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.andro ...

  9. 浏览器缓存知识+JS实现缓存

    http header中与缓存有关的关键属性 Etag:倾向于资源是否变更 Last-modified: 倾向于时间状态的变更. cache-control:[public.private.no-st ...

最新文章

  1. Nginx 的启动、停止、平滑重启、信号控制和平滑升级
  2. Linux命令 iperf - 网络性能测试工具
  3. 运算符的优先级和实际操作
  4. 统计源期刊目录_统计源期刊是什么意思
  5. phpeclipse+xdebug配置
  6. linux中的lock文件,linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是“F_UNLCK”?...
  7. CAD2020操作手册
  8. android 桌面小插件下载地址,桌面小组件app下载
  9. B站的经典封面制作方法
  10. 群晖(synology)日历与IPhone日历同步
  11. 【实战】在qgis上查看街景照片( go2streetview谷歌街景、go2mapillary)
  12. 关于RuntimeError: Cannot re-initialize CUDA in forked subprocess和CUDA error: initialization error的解决
  13. java 批量文件编码转换 GBK to UTF-8(swing界面)
  14. IT项目经理沟通技巧的重要性
  15. RAKsmart CN2 VPS主机性能评测
  16. SourceTree 下载及跳过注册码
  17. JScript.NET或者JScript是什么?
  18. u盘同步服务器文件,GoodSync配合U盘助你自动同步文件
  19. Java测试-mockito学习
  20. 几个自用的虚拟机镜像文件,兼容VMware vbox等虚拟机 ova格式直接导入

热门文章

  1. [微博]页面table 闪动问题解决
  2. crt查看oracle安装目录,ORACLE 11g数据库安装步骤
  3. matlab移动文件到另一个文件夹里,Matlab将文件分类移动到不同文件夹中
  4. mysql 添加删除权限_MySQL实例讲解:添加账户、授予权限、删除用户
  5. php 数据映射,数据映射模式(Data Mapper)
  6. 计算机三级之嵌入式系统学习笔记6
  7. mysql被跑死_MySQL 8.0.23中复制架构从节点自动故障转移
  8. Python将类对象转换为json
  9. 使用前台方式启动Redis时,出现Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use报错
  10. win8.1 windows无法在此计算机上设置家庭组,【求助】Windows无法从该家庭组中删除你的计算机...