我正在尝试在我的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<String> List = new ArrayList<String>(); 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无法处理容器对象是否会成为问题.
The full source and original post can be found here
编辑(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的磁盘缓存库?
解决方法:
问题是缓存大小太小.
我通过更改此方法解决了该问题:
diskLruCache = diskLruCache.open(new file("diskLruCache"), 1, 2, 20 * 2^20);
对此:
diskLruCache = diskLruCache.open(new file("diskLruCache"), 1, 2, (long) (20 * Math.pow(2, 20)));
^是按位异或运算符,而不是指数运算符,因此缓存大小实际上是20 * 2 ^ 20 == 60而不是应该的大小:20 * Math.pow(2,20)== 20971520.
总结以上是内存溢出为你收集整理的java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?全部内容,希望文章能够帮你解决java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)