Android 在缓存中保存对象

Android 在缓存中保存对象,android,arrays,object,caching,Android,Arrays,Object,Caching,我试图在一定时间内保存来自服务器的缓存响应 还有下一个要保存在缓存中的数据:我有一个从服务器获取的列表。当用户工作时,他可以下载多达230个列表(但达到这个目标是不真实的,估计是10-50)。 ProgrammeItemoblect包括字符串、int、int[] 这就是我保存和获取上次下载的列表的方式。: //saving / getting Programme items public boolean saveObject(List<ProgrammeItem> obj) {

我试图在一定时间内保存来自服务器的缓存响应

还有下一个要保存在缓存中的数据:我有一个从服务器获取的
列表。当用户工作时,他可以下载多达230个
列表
(但达到这个目标是不真实的,估计是10-50)。
ProgrammeItem
oblect包括字符串、int、int[]

这就是我保存和获取上次下载的
列表的方式。

//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
//保存/获取程序项
公共布尔存储对象(列表对象){
final File suspend_f=新文件(android.os.Environment.getExternalStorageDirectory(),“test”);
FileOutputStream=null;
ObjectOutputStream oos=null;
布尔保持=真;
试一试{
fos=新文件输出流(挂起);
oos=新对象输出流(fos);
oos.writeObject(obj);
}捕获(例外e){
保持=假;
Log.e(“捕获异常”,“+e.getMessage()+”;;“+e”);
}最后{
试一试{
如果(oos!=null)oos.close();
如果(fos!=null)fos.close();
如果(keep==false)挂起;
}catch(异常e){/*什么也不做*/}
}
返回保持;
}
公共列表getObject(上下文c){
final File suspend_f=新文件(android.os.Environment.getExternalStorageDirectory(),“test”);
List simpleClass=null;
FileInputStream fis=null;
ObjectInputStream为空;
试一试{
fis=新文件输入流(挂起);
is=新的ObjectInputStream(fis);
simpleClass=(列表)是.readObject();
}捕获(例外e){
字符串val=e.getMessage();
}最后{
试一试{
如果(fis!=null)fis.close();
如果(is!=null)是.close();
}捕获(例外e){}
}
返回简单类;
}
这就是我在活动中保存和获取对象的方式:

//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
PI=newprogrammietem();
List programmeItems=new ArrayList();
...
//使用来自服务器的数据填充程序项
...
布尔结果=PI.saveObject(programmeItems)//保存对象
ProgrammeItem m=新的ProgrammeItem();
List c=m.getObject(getApplicationContext())//获取对象
问题是:如何保存大量对象而不是一个对象?

我想我应该像
public boolean addObjectsInCache(List obj)
那样添加对象,而不是覆盖它们

并将get方法更改为
公共列表getObject(Context c,String id)
,其中
id
将是唯一标识符,它将包含在每个
列表中的每个
程序项中

我说得对吗?我怎样才能做到这一点呢?也许你会告诉我处理对象和缓存的其他方法?

你可以改用,同时也可以选择使用本地数据库。SharedReference基本上存储在设备的缓存中,而本地数据库存储在设备的数据中,因此在我们的应用程序中,我们具有清除缓存和清除数据功能

额外资源:

  • 堆栈溢出:
  • 基于对象的首选项库:我建议您使用这个库,因为它可以轻松地为您节省基于列表的对象和检索它们的时间。您还可以在需要时向持久化列表对象添加更多内容
  • 安全首选项:

一个选项可以是将房间数据库用于:


如果这些都能放在内存中。

1)我正在使用SharedReferences来满足我的其他需求(字符串等),我会阅读这篇文章,谢谢;2) 在商业项目中使用此库(PreferencesManager)是否可以接受且安全?3) 或者您是说使用安全首选项加密数据,我将使用PreferencesManager保存数据?如果您认为数据非常敏感,我建议您使用安全首选项+GSON(如果数据简单且不需要查询),但是如果您认为使用数据库是理想的,一个安全的替代方案是密码集成,以使其安全。例如,对于SharedPref,您可以拥有任意数量的密码,也可以使用android密钥库保护密码。我选择了SharedPref和Gson的变体-它使用内部android工具,实现起来与这些库一样简单。我有比那些指南中更多的代码,但不是很多——只是因为我没有标准的json字符串。它现在工作得很好,我没有看到这种方法的任何缺点。谢谢您的帮助。是的,每个
列表
项最多40Kb,我想这很合适@Mike也建议使用房间数据库,所以我会尝试一下并回复您。