Сохранение объектов в кеше - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь сохранить в кеше ответ от сервера в течение определенного времени.

Есть следующие данные для сохранения в кеше: у меня есть List<ProgrammeItem>, который я получаю с сервера. Пока пользователь работает, он может загрузить до ~ 230 List<ProgrammeItem> (но достичь этого нереально, по оценкам, 10-50). ProgrammeItem oblect, включая строки, int, int [].

Вот как я сохраняю и получаю последнюю загруженную List<ProgrammeItem>:

//saving / getting Programme items
public boolean saveObject(List<ProgrammeItem> obj) {
    final File suspend_f=new File(android.os.Environment.getExternalStorageDirectory(), "test");

    FileOutputStream   fos  = null;
    ObjectOutputStream oos  = null;
    boolean            keep = true;

    try {
        fos = new FileOutputStream(suspend_f);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);
    } catch (Exception e) {
        keep = false;
        Log.e("catching exception ", "" + e.getMessage() + ";;;" + e);

    } finally {
        try {
            if (oos != null)   oos.close();
            if (fos != null)   fos.close();
            if (keep == false) suspend_f.delete();
        } catch (Exception e) { /* do nothing */ }
    }

    return keep;
}

public List<ProgrammeItem> getObject(Context c) {
    final File suspend_f=new File(android.os.Environment.getExternalStorageDirectory(), "test");

    List<ProgrammeItem> simpleClass= null;
    FileInputStream fis = null;
    ObjectInputStream is = null;

    try {
        fis = new FileInputStream(suspend_f);
        is = new ObjectInputStream(fis);
        simpleClass = (List<ProgrammeItem>) is.readObject();
    } catch(Exception e) {
        String val= e.getMessage();
    } finally {
        try {
            if (fis != null)   fis.close();
            if (is != null)   is.close();
        } catch (Exception e) { }
    }

    return simpleClass;
}

Вот как я сохраняю и получаю объект в действии:

PI = new ProgrammeItem();
List<ProgrammeItem> programmeItems = new ArrayList<>();
...
//filling programmeItems with data from server
...
boolean result = PI.saveObject(programmeItems); //Save object
ProgrammeItem m = new ProgrammeItem();
List<ProgrammeItem> c = m.getObject(getApplicationContext()); //Get object

Вопрос: как я могу сохранить много своих объектов вместо одного?

Я думаю, что я должен сделать что-то вроде public boolean addObjectsInCache(List<ProgrammeItem> obj) для добавления объектов, а не их переопределения.

И измените метод get на public List<ProgrammeItem> getObject(Context c, String id), где id будет уникальным идентификатором, который будет включаться в каждый ProgrammeItem в каждом List<ProgrammeItem>.

Am I правильно? И как мне этого добиться? Может, вы покажете мне другой способ работы с объектами и кешем?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Можно использовать базу данных комнат с inMemoryDatabaseBuilder :

db = Room.inMemoryDatabaseBuilder(context, ProgrammeDatabase::class.java)
                .build()

, если все это может поместиться в памяти.

1 голос
/ 31 марта 2020

Вместо этого можно использовать SharedPreference , при этом также можно использовать локальную базу данных Android Комната . SharedPreference в основном хранится в кеше вашего устройства, в то время как локальная база данных хранится в данных вашего устройства, поэтому в наших приложениях есть функция очистки кэша и очистки данных.

Дополнительные ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...