Лучший способ кэширования данных в Android - PullRequest
24 голосов
/ 05 января 2010

У меня есть ArrayList пользовательских, простых Serializable объектов, которые я хотел бы кэшировать на диск и читать при повторном запуске. Мои данные очень маленькие, около 25 объектов и не более 5 списков, так что я думаю, что SQLite будет излишним. В мире iPhone я бы использовал NSKeyedArchiver и NSKeyedUnarchiver, что прекрасно работает. На Android я пытался сделать это с FileOutputStream и ObjectOutputStream, и хотя результат одинаков, производительность ужасна. Есть ли лучший (читать быстрее) способ кэширования небольших объектов в файловой системе Android?

Ответы [ 3 ]

19 голосов
/ 05 января 2010

Для чего стоит я кэширую некоторые из моих данных String на диск, используя BufferedWriter / BufferedReader, и это очень быстро. На самом деле это быстрее, чем хранить те же данные в SharedPreferences. Код выглядит примерно так (обратите внимание, что когда вы предоставляете размер буфера, все происходит быстрее)

final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024);
out.write(stuff);
out.close();
4 голосов
/ 15 июля 2014
public class MyClass implements Serializable 
{
private static final long serialVersionUID = 1L;

public String title;
public String startTime;
public String endTime;
public String day;

public boolean classEnabled;


public MyClass(String title, String startTime, boolean enable) {
    this.title = title;
    this.startTime = startTime;
    this.classEnabled = enable;
}

public boolean saveObject(MyClass obj) {   
    final File suspend_f=new File(SerializationTest.cacheDir, "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;
    } 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 MyClass getObject(Context c) {
    final File suspend_f=new File(SerializationTest.cacheDir, "test");

    MyClass simpleClass= null;
    FileInputStream fis = null;
    ObjectInputStream is = null;

    try {
        fis = new FileInputStream(suspend_f);
        is = new ObjectInputStream(fis);
        simpleClass = (MyClass) 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;  
}

и звонки с мероприятия

 if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject");
else
cacheDir= getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();

MyClass m = new MyClass("umer", "asif", true);
boolean result = m.saveObject(m);

if(result)
Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show();

else
Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show();   

 MyClass m = new MyClass();
 MyClass c = m.getObject(this);

 if(c!= null)

 Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show();

  else

 Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show();

Не забудьте использовать разрешения write_external_storage в файле манифеста.

3 голосов
/ 05 января 2010

Трудно понять без профилирования, но я предполагаю, что ваша низкая производительность сводится к использованию ObjectOutputStream. Вы пытались написать свои собственные writeObject(ObjectOutputStream) и readObject(ObjectOutputStream) методы , так как это может помочь производительности.

Вы можете использовать инструмент traceview, чтобы точно определить, где приложение работает медленно. Посмотрите на этот вопрос для получения инструкций по использованию traceview.

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