Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Rembo88
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 39
#1

Создание кеша в InternalStorage

28.07.2015, 19:07. Просмотров 208. Ответов 0
Метки нет (Все метки)

Коллеги, доброго времени суток!
В моём приложении необходимо реализовать оффлайн режим и по сему возникла необходимость в создании механизма кеширования. Суть проста: обращаемся к сервису--> сохраняем данные в кеш--> получаем данные из кеша и отображаем на контролах. Вот тут и возникли некоторые проблемы...
Кеш успешно сохраняет и загружает примитивные типы и 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());
            }
        }
    }
}

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2015, 19:07
Ответы с готовыми решениями:

Устройство internalStorage
Вообщем столкнулся с непонятной ситуацией для меня: запускаю стандартный...

изменение пути для кеша
Кто-нибудь знает, можно ли изменить путь для кеша, тоесть чтобы он сохранялся...

Как получить доступ к устаревшим фрагментам после чистки кеша
Доброго времени суток. Во время написания приложения возникла данная проблема....

Создать базу данных с(Создание функции БД, Создание процедуры БД, Создание тригера БД)
В задание для курсовой работы по БД входят вот такие пункты: 1.2 Создание...

Видео из кеша.
Пытался сохранить видео с rutube.ru,через кэш,но ничего не получилось,в кэше...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 19:07

Скрепинг данных кеша
Если это законно)))) есть способы получить с помощью JS данные содержащиеся в...

Использование кеша браузера
Доброго времени суток, сталкнулся с такой проблемой как Используйте кеш...

Удаление элемента с кеша
Всем привет. Подскажите пожалуйста с 1 строкой. Работающая строка удаляющая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru