Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 39
1

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

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

Author24 — интернет-сервис помощи студентам
Коллеги, доброго времени суток!
В моём приложении необходимо реализовать оффлайн режим и по сему возникла необходимость в создании механизма кеширования. Суть проста: обращаемся к сервису--> сохраняем данные в кеш--> получаем данные из кеша и отображаем на контролах. Вот тут и возникли некоторые проблемы...
Кеш успешно сохраняет и загружает примитивные типы и 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2015, 19:07
Ответы с готовыми решениями:

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

Чистка кеша
День добрый. Подскажите, существует какой нибудь хороший способ выгрузить кешированную память ?...

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

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

0
28.07.2015, 19:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2015, 19:07
Помогаю со студенческими работами здесь

Получение ссылки из кеша
Имеется такой вот код: using System; using System.Runtime.InteropServices; // Visual C#...

Раздел для кеша?
Прошу подсказать мне точку для кеша. Я в сети посмотрел, и прочитал совет выделить отдельно около...

Yii2 очистка кеша
Добрый день. YII2 Кеширую AR таким образом: $data= Checkout::getDb()-&gt;cache(function ($db) { ...

Папка для кеша
где на телефонах Samsung Galaxy Ace папка для кеша (obb)?


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru