java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?

java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?,第1张

概述我正在尝试在我的Android应用程序中使用JakeWharton的DiskLruCache,但似乎无法弄清楚如何使用缓存正确地序列化和反序列化对象.在基本的命令行Java程序中使用以下代码:DiskLruCache.Editoreditor=null;try{editor=diskLruCache.edit("objects");OutputStreamt

我正在尝试在我的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正确读取和写入数据?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存