介绍SharedPreferences工具类对简单和复杂对象的存储
对于复杂的对象存储android sdk本身没有提供相关api,如果想通过xml节点表示复杂对象在解析这块花的功夫就比较大了,于是找到一个简单方法,那就是用base64存储序列化的对象按string类型存储你懂的。
一下是我在项目中用到的实测过的代码:
一下是我在项目中用到的实测过的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/**
* SharedPreferences工具类
*
* @author bobby
*
*/
public
class
SharedPreferencesUtils {
Context context;
String name;
public
SharedPreferencesUtils(Context context, String name) {
this
.context = context;
this
.name = name;
}
/**
* 根据key和预期的value类型获取value的值
*
* @param key
* @param clazz
* @return
*/
public
<T> T getValue(String key, Class<T> clazz) {
if
(context ==
null
) {
throw
new
RuntimeException(
"请先调用带有context,name参数的构造!"
);
}
SharedPreferences sp =
this
.context.getSharedPreferences(
this
.name, Context.MODE_PRIVATE);
return
getValue(key, clazz, sp);
}
/**
* 针对复杂类型存储<对象>
*
* @param key
* @param val
*/
public
void
setObject(String key, Object object) {
SharedPreferences sp =
this
.context.getSharedPreferences(
this
.name, Context.MODE_PRIVATE);
ByteArrayOutputStream baos =
new
ByteArrayOutputStream();
ObjectOutputStream out =
null
;
try
{
out =
new
ObjectOutputStream(baos);
out.writeObject(object);
String objectVal =
new
String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
Editor editor = sp.edit();
editor.putString(key, objectVal);
editor.commit();
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
try
{
if
(baos !=
null
) {
baos.close();
}
if
(out !=
null
) {
out.close();
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings
(
"unchecked"
)
public
<T> T getObject(String key, Class<T> clazz) {
SharedPreferences sp =
this
.context.getSharedPreferences(
this
.name, Context.MODE_PRIVATE);
if
(sp.contains(key)) {
String objectVal = sp.getString(key,
null
);
byte
[] buffer = Base64.decode(objectVal, Base64.DEFAULT);
ByteArrayInputStream bais =
new
ByteArrayInputStream(buffer);
ObjectInputStream ois =
null
;
try
{
ois =
new
ObjectInputStream(bais);
T t = (T) ois.readObject();
return
t;
}
catch
(StreamCorruptedException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
catch
(ClassNotFoundException e) {
e.printStackTrace();
}
finally
{
try
{
if
(bais !=
null
) {
bais.close();
}
if
(ois !=
null
) {
ois.close();
}
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
null
;
}
/**
* 对于外部不可见的过渡方法
*
* @param key
* @param clazz
* @param sp
* @return
*/
@SuppressWarnings
(
"unchecked"
)
private
<T> T getValue(String key, Class<T> clazz, SharedPreferences sp) {
T t;
try
{
t = clazz.newInstance();
if
(t
instanceof
Integer) {
return
(T) Integer.valueOf(sp.getInt(key,
0
));
}
else
if
(t
instanceof
String) {
return
(T) sp.getString(key,
""
);
}
else
if
(t
instanceof
Boolean) {
return
(T) Boolean.valueOf(sp.getBoolean(key,
false
));
}
else
if
(t
instanceof
Long) {
return
(T) Long.valueOf(sp.getLong(key, 0L));
}
else
if
(t
instanceof
Float) {
return
(T) Float.valueOf(sp.getFloat(key, 0L));
}
}
catch
(InstantiationException e) {
e.printStackTrace();
Log.e(
"system"
,
"类型输入错误或者复杂类型无法解析["
+ e.getMessage() +
"]"
);
}
catch
(IllegalAccessException e) {
e.printStackTrace();
Log.e(
"system"
,
"类型输入错误或者复杂类型无法解析["
+ e.getMessage() +
"]"
);
}
Log.e(
"system"
,
"无法找到"
+ key +
"对应的值"
);
return
null
;
}
}
|