我得到一个问题,由于在Android 4.4 Kitkat上的一个查询库,当滚动通过GridView/ListView加载带有分页的图像时,才会延迟加载图像。
以下是日志:
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似乎我需要最小化外部存储上的打开文件,但如何做到呢?有什么想法吗?
发布于 2014-03-01 02:24:07
安卓查询发布了另一个版本(0.26.8)来解决这个问题:https://code.google.com/p/android-query/wiki/ReleaseNote#0.26.8
发布于 2013-12-05 17:09:27
编辑:我可以复制它,而且它似乎只在Kitkat上发生。以前版本的查询也有这个问题。看看现在发生了什么。
好的,我刚刚测试过了。问题是导致我的inPurgeable设置:
Why would I ever NOT use BitmapFactory's inPurgeable option?
当显示的图像太多时,就会发生这种情况。如果没有这个选项,应用程序会比文件限制更快地耗尽内存(所以情况更糟)。
我的建议是限制活动中的图像或仍在使用的片段的数量。
我正在检查是否有更好的解决方案,但可能需要一些时间。
您也可以尝试其他图像加载库,看看是否会发生这种情况。
发布于 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
https://stackoverflow.com/questions/20394213
复制相似问题