将对象存储到SharedPreferences里
2016-04-12 16:04
302 查看
原理:
需要将对象序列化,然后将序列化后的对象以字符串的方式保存在手机中
具体代码如下
需要将对象序列化,然后将序列化后的对象以字符串的方式保存在手机中
具体代码如下
package com.bestours.youlun.utils; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.text.TextUtils; import android.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * Created by sunny on 16/4/7. */ public class SPUtil { /** * 从起启动应用,保存的搜索条件清空 * * @param mContext */ public static void initOption(Activity mContext) { SPUtil.saveObject(mContext, "destinationShow", null); SPUtil.saveObject(mContext, "companyShow", null); SPUtil.saveObject(mContext, "nightShow", null); SPUtil.saveObject(mContext, "dayShow", null); } /** * desc:获取保存的Object对象 * * @param context * @param key * @return modified: */ public static Object readObject(Context context, String key) { Object readObject = null; try { SharedPreferences sharedata = context.getSharedPreferences("config", 0); if (sharedata.contains(key)) { String string = sharedata.getString(key, ""); if (TextUtils.isEmpty(string)) { readObject = null; } else { //将16进制的数据转为数组,准备反序列化 byte[] stringToBytes = StringToBytes(string); ByteArrayInputStream bis = new ByteArrayInputStream(stringToBytes); ObjectInputStream is = new ObjectInputStream(bis); //返回反序列化得到的对象 readObject = is.readObject(); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); readObject = null; } //所有异常返回null return readObject; } /** * desc:将16进制的数据转为数组 * <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p> * * @param data * @return modified: */ public static byte[] StringToBytes(String data) { String hexString = data.toUpperCase().trim(); if (hexString.length() % 2 != 0) { return null; } byte[] retData = new byte[hexString.length() / 2]; for (int i = 0; i < hexString.length(); i++) { int int_ch; // 两位16进制数转化后的10进制数 char hex_char1 = hexString.charAt(i); ////两位16进制数中的第一位(高位*16) int int_ch1; if (hex_char1 >= '0' && hex_char1 <= '9') int_ch1 = (hex_char1 - 48) * 16; //// 0 的Ascll - 48 else if (hex_char1 >= 'A' && hex_char1 <= 'F') int_ch1 = (hex_char1 - 55) * 16; //// A 的Ascll - 65 else return null; i++; char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位) int int_ch2; if (hex_char2 >= '0' && hex_char2 <= '9') int_ch2 = (hex_char2 - 48); //// 0 的Ascll - 48 else if (hex_char2 >= 'A' && hex_char2 <= 'F') int_ch2 = hex_char2 - 55; //// A 的Ascll - 65 else return null; int_ch = int_ch1 + int_ch2; retData[i / 2] = (byte) int_ch;//将转化后的数放入Byte里 } return retData; } /** * desc:保存对象 * * @param context * @param key * @param obj 要保存的对象,只能保存实现了serializable的对象 * modified: */ public static void saveObject(Context context, String key, Object obj) { try { // 保存对象 SharedPreferences.Editor sharedata = context.getSharedPreferences("config", 0).edit(); //先将序列化结果写到byte缓存中,其实就分配一个内存空间 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bos); //将对象序列化写入byte缓存 os.writeObject(obj); //将序列化的数据转为16进制保存 String bytesToHexString = bytesToHexString(bos.toByteArray()); //保存该16进制数组 sharedata.putString(key, bytesToHexString); sharedata.commit(); } catch (IOException e) { e.printStackTrace(); Log.e("", "保存obj失败"); } } /** * desc:将数组转为16进制 * * @param bArray * @return modified: */ public static String bytesToHexString(byte[] bArray) { if (bArray == null) { return null; } if (bArray.length == 0) { return ""; } StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } }
相关文章推荐
- 剑指offer系列之29:连续子数组的最大和
- jQuery表单选择器
- js字符串常用方法
- 浅谈JSON.parse()、JSON.stringify()和eval()的作用
- JavaScript 的数组操作--删除元素
- javascript中去除数组重复元素的实现方法【实例】
- JSP-Servlet中文乱码
- JS之处理数字千位分隔符
- Bootstrap笔记和相关知识点整理
- web与js的简单交互(朱祈林)
- jsp页面 倒计时 js方法
- javascript:parseInt()、Number()和+对比
- angularjs 发送ajax请求的问题
- Node.js 未来会超越 Java 吗?
- Bootstrap每天必学之折叠
- javascript内置对象
- Exception in window.onload: Error: An error has ocurredJSPlugin.3005
- JS 混淆加密
- JavaScript几种数组去掉重复值的方法推荐
- 斐波那契数列第n个数