Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Rembo88
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 39
#1

Создание кеша в InternalStorage - Программирование Android

28.07.2015, 19:07. Просмотров 171. Ответов 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 (Программирование Android):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2015, 19:07
Привет! Вот еще темы с ответами:

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

Использование кеша браузера - Web
Доброго времени суток, сталкнулся с такой проблемой как Используйте кеш браузера ? при проверка на https://developers.google.com/speed/...

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

Обновление Кеша в OrCad 9.2 - САПР и PCB-дизайн
Проблема возникает при работе с созданими мной елементами. Если в проект я добавил елемент, но увидел что он немного коряво сделан, и надо...


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

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

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