不废话,需求:缓存登录时的token,超过设置的存储时间就无效,怎么做?
使用ACache也可以设置缓存时间,但ACache在清缓存的时候会被清空。
SharedPreferences存储默认都是无时间限制的。
大概思路是,存储的时候记录当前时间,要存多久。取数据的时候判断这个数据已经存储了多久,如果超过设置的存储时间,就获取默认值。
1,首先,我们需要一个存储的model——SpSaveModel
public class SpSaveModel<T> 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) { SpSaveModel<String>spSaveModel=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) { SpSaveModel<String>spSaveModel=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)){ SpSaveModel<String>spSaveModel= JSON.parseObject(json, new TypeReference<SpSaveModel<String>>(){}); if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){ return spSaveModel.getValue(); } } return defValue; } public void setInt(String e, int value) { SpSaveModel<Integer>spSaveModel=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) { SpSaveModel<Integer>spSaveModel=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)){ SpSaveModel<Integer>spSaveModel= JSON.parseObject(json, new TypeReference<SpSaveModel<Integer>>(){}); if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){ return spSaveModel.getValue(); } } return defValue; } public void setBoolean(String e, boolean value) { SpSaveModel<Boolean>spSaveModel=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) { SpSaveModel<Boolean>spSaveModel=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)){ SpSaveModel<Boolean>spSaveModel= JSON.parseObject(json, new TypeReference<SpSaveModel<Boolean>>(){}); if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){ return spSaveModel.getValue(); } } return defValue; } public void setLong(String e, long value) { SpSaveModel<Long>spSaveModel=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) { SpSaveModel<Long>spSaveModel=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)){ SpSaveModel<Long>spSaveModel= JSON.parseObject(json, new TypeReference<SpSaveModel<Long>>(){}); if(isTimeOut(spSaveModel.getCurrentTime(),spSaveModel.getSaveTime())){ return spSaveModel.getValue(); } } return defValue; } public boolean isTimeOut(long saveCurrentTime,int saveTime){ return (System.currentTimeMillis()-saveCurrentTime)/DURATION_UNIT<saveTime; } public void set(String e, Object value,int saveTime) { SpSaveModel<Object>spSaveModel=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:存的时候,不加存储时间,默认是永久