Коллеги, доброго времени суток!
В моём приложении необходимо реализовать оффлайн режим и по сему возникла необходимость в создании механизма кеширования. Суть проста: обращаемся к сервису--> сохраняем данные в кеш--> получаем данные из кеша и отображаем на контролах. Вот тут и возникли некоторые проблемы...
Кеш успешно сохраняет и загружает примитивные типы и String, но отказывается делать это с объектом, который я получаю от сервиса(Объект реализует интерфейс Serializable). При этом исключения не выбрасываются - из кеша просто возвращается null. Буду благодарен,если кто-то сможет навести меня на мысль почему так происходит)) Код ниже:
Объект, который необходимо кешировать:
Java |
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
| import java.io.Serializable;
/** Модель пользователя */
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Создание объекта, содержащего информацию о пользователе.
* @param aName ФИО пользователя.
* @param aPosition должность пользователя.
* @param aLevel грейд.
*/
public UserInfo(String aName, String aPosition, String aLevel) {
this.name = aName;
this.level = aLevel;
this.position = aPosition;
}
/** ФИО пользователя */
private String name;
/** уровень пользователя */
private String level;
/** должность пользователя */
private String position;
/** Далее геттеры и сеттеры... */ |
|
Объект кеша:
Java |
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
| public class Cache<T extends Serializable> {
/** Singleton */
private static volatile Cache instance;
/** true - объект закеширован; false - объект не кеширован */
private boolean isCached;
private Cache() {
}
/** Получить инстанс кеша */
public static synchronized Cache getInstance() {
Cache localInstance = instance;
if (localInstance == null) {
synchronized (Cache.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Cache();
}
}
}
return localInstance;
}
// Положить объект в кеш
public boolean putIntoCache(Context context, String fileName, T objectForCaching) {
// Формируем путь к объекту для кеширования
final File file = new File(context.getCacheDir(), fileName);
// Проверяем,нужно ли заменить объект в кеше
T restoreObject = fetchFromCache(context, fileName);
// Если кеш пустой,то кешируем внешний объект
if (restoreObject == null) {
cache(file, objectForCaching);
isCached = true;
} else {
// Если кеш не пустой,то сравниваем входящий объект и объект из кеша
if (!restoreObject.equals(objectForCaching)) {
cache(file, objectForCaching);
isCached = true;
} else {
isCached = false;
}
}
return isCached;
}
// Получить объект из кеша
public T fetchFromCache(Context context, String fileName) {
// Объект из кеша
T restoreObject = null;
// Формируем путь к объекту, который нужно достать из кеша
final File file = new File(context.getCacheDir(), fileName);
FileInputStream fis = null;
ObjectInputStream ois = null;
// Достаём объект из кеша
try {
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
restoreObject = (T) ois.readObject();
ois.close();
} catch (IOException ex) {
Log.d("Cache class: ", ex.toString());
} catch (ClassNotFoundException ex) {
Log.d("Cache class: ", ex.toString());
} finally {
try {
if (ois != null)
ois.close();
if (fis != null)
fis.close();
} catch (Exception e) {
Log.d("Cache class: ", e.toString());
}
}
return restoreObject;
}
// Кеширование
private void cache(File file, T objectForCaching) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
// Сохраняем объект в кеш
try {
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(objectForCaching);
oos.flush();
oos.close();
isCached = true;
} catch (IOException ex) {
isCached = false;
Log.d("Cache class: ", ex.toString());
} finally {
try {
if (oos != null)
oos.close();
if (fos != null)
fos.close();
} catch (Exception e) {
Log.d("Cache class: ", e.toString());
}
}
}
} |
|