我正在尝试在我的Android应用程序中使用Jake Wharton的DiskLruCache,但似乎无法弄清楚如何使用缓存正确地序列化和反序列化对象.在基本的命令行Java程序中使用以下代码:
DiskLruCache.Editor editor = null;
try {
editor = diskLruCache.edit("objects");
OutputStream timeOs = editor.newOutputStream(0);
OutputStream dataOs = editor.newOutputStream(1);
OutputStream timeBos = new BufferedOutputStream(timeOs);
OutputStream dataBos = new BufferedOutputStream(dataOs);
ObjectOutputStream timeOos = new ObjectOutputStream(timeBos);
ObjectOutputStream dataOos = new ObjectOutputStream(dataBos);
long createTime = System.currentTimeMillis();
String str = "testString";
ArrayList list = new ArrayList();
list.add("item1");
list.add("item2");
timeOos.writeLong(createTime);
// this works:
dataOos.writeObject(str);
// this does not work:
//dataOos.writeObject(list);
timeOos.close();
dataOos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (editor != null)
try {
editor.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
timeOos.writeLong(createTime)和dataOos.writeObject(str)成功将数据写入高速缓存,但是用dataOos.writeObject(list)替换dataOos.writeObject(str)不起作用.我试过了ArrayLists和HashMaps,看来它们没有被序列化并写入缓存.该程序执行所有代码,然后挂起一分钟左右,然后返回,仅将日志文件保留在缓存目录中.
我不确定DiskLruCache无法处理容器对象是否会成为问题.
编辑(2014-01-03):
Here’s a JUnit test using the Android SDK. testStoreLong(),testStoreString()和testStoreArrayList()通过,但testPersistArrayListSnapshot()和testPersistArrayListEditor()失败.
这是一个奇怪的问题;如果我在第101行(editor.commit();)处设置了一个断点,则继续执行,未创建缓存文件test-store-array-list.0且快照== null,导致测试失败.但是,如果我在第103行放置一个断点(DiskLruCache.Snapshot snapshot = mDiskLruCache.get(“ test-store-array-list”);),该文件将按预期创建.
DiskLruCache中可能存在错误;是否有其他兼容Android的磁盘缓存库?