首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aquery Android 4.4 Kitkat上的Android问题

Aquery Android 4.4 Kitkat上的Android问题
EN

Stack Overflow用户
提问于 2013-12-05 15:44:14
回答 3查看 2K关注 0票数 4

我得到一个问题,由于在Android 4.4 Kitkat上的一个查询库,当滚动通过GridView/ListView加载带有分页的图像时,才会延迟加载图像。

以下是日志:

代码语言:javascript
复制
12-03 10:39:43.678: W/AQuery(6261): reporting:java.io.IOException: open failed: EMFILE (Too many open files)
12-03 10:39:43.678: W/AQuery(6261): at java.io.File.createNewFile(File.java:946)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.getPreFile(AbstractAjaxCallback.java:1150)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.httpDo(AbstractAjaxCallback.java:1609)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.httpGet(AbstractAjaxCallback.java:1344)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.network(AbstractAjaxCallback.java:1243)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.networkWork(AbstractAjaxCallback.java:1082)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.backgroundWork(AbstractAjaxCallback.java:1014)
12-03 10:39:43.678: W/AQuery(6261): at com.androidquery.callback.AbstractAjaxCallback.run(AbstractAjaxCallback.java:977)
12-03 10:39:43.678: W/AQuery(6261): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-03 10:39:43.678: W/AQuery(6261): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-03 10:39:43.678: W/AQuery(6261): at java.lang.Thread.run(Thread.java:841)
12-03 10:39:43.678: W/AQuery(6261): Caused by: libcore.io.ErrnoException: open failed: EMFILE (Too many open files)
12-03 10:39:43.678: W/AQuery(6261): at libcore.io.Posix.open(Native Method)
12-03 10:39:43.678: W/AQuery(6261): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
12-03 10:39:43.678: W/AQuery(6261): at java.io.File.createNewFile(File.java:939)
12-03 10:39:43.678: W/AQuery(6261): ... 10 more

似乎我需要最小化外部存储上的打开文件,但如何做到呢?有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2014-03-01 02:24:07

安卓查询发布了另一个版本(0.26.8)来解决这个问题:https://code.google.com/p/android-query/wiki/ReleaseNote#0.26.8

票数 6
EN

Stack Overflow用户

发布于 2013-12-05 17:09:27

编辑:我可以复制它,而且它似乎只在Kitkat上发生。以前版本的查询也有这个问题。看看现在发生了什么。

好的,我刚刚测试过了。问题是导致我的inPurgeable设置:

Why would I ever NOT use BitmapFactory's inPurgeable option?

当显示的图像太多时,就会发生这种情况。如果没有这个选项,应用程序会比文件限制更快地耗尽内存(所以情况更糟)。

我的建议是限制活动中的图像或仍在使用的片段的数量。

我正在检查是否有更好的解决方案,但可能需要一些时间。

您也可以尝试其他图像加载库,看看是否会发生这种情况。

票数 2
EN

Stack Overflow用户

发布于 2014-02-06 05:49:08

我在KitKat中遇到了同样的问题。修复方法如下:在BitmapAjaxCallback.java中将options.inInputShareable从'true‘改为'false’每个从任何网址加载的位图都被存储到文件中。如果inInputShareable为true,则您的进程具有重复的文件描述符以供共享。因此,当>1024个文件描述符泄漏时,就会发生EMFILE。但实际上我不明白为什么在KitKat之前它能正常工作:)

P.S. inInputShareable=false作为inPurgeable=false工作,并导致快速面向对象:( AQuery中正确的修复方法是将BitmapFactory.decodeFileDescriptor的调用更改为BitmapFactory.decodeByteArray (不要使用decodeStream!它忽略了inPurgeable,尽管它有JavaDocs)

我发现这个问题与KitKat中的错误有关:https://code.google.com/p/android/issues/detail?id=65638

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20394213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档