2013-12-05 3 views
4

Я получаю сообщение из-за библиотеки Aquery для ленивой загрузки изображений на Android 4.4 Kitkat только при прокрутке изображений GridView/ListView с разбивкой на страницы.Проблема с продуктом Aquery на Android 4.4 Kitkat

Ниже приведены журналы:

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 

Кажется, мне нужно минимизировать открытые файлы на внешнем хранилище, но как это сделать? Есть идеи ???

ответ

2

Редактировать: Я могу воспроизвести его, и, похоже, это происходит только на Киткате. Раньше в версиях акверия также возникала эта проблема. Проверка того, что происходит сейчас.

Хорошо, я только что протестировал его. Вопрос вызывает мою inPurgeable настройки:

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

Это произойдет, когда есть слишком много изображений отображаются. Без опции у приложения будет нехватка памяти быстрее, чем ограничение файла (так что это еще хуже).

Я предлагаю ограничить количество изображений в действии или фрагментах, которые все еще используются.

Я проверяю, есть ли лучшее решение, но, скорее всего, потребуется некоторое время.

Возможно, вы также попробуете другую библиотеку для загрузки изображений и посмотрите, не получится ли это.

+0

Как только я нажимаю кнопку Назад, приложение разбивается со следующими журналами: – Nitin4Android

+0

12-05 17: 44: 19.80 8: E/InputChannel-JNI (1683): ​​Ошибка 24 дуп-канала fd 86. 12-05 17: 44: 19.818: E/InputEventSender (1683): ​​Исправление отправки готового сигнала. 12-05 17: 44: 19.818: E/MessageQueue-JNI (1683): ​​Исключение в обратном вызове MessageQueue: handleReceiveCallback – Nitin4Android

+0

Как ограничить количество изображений в действии или фрагментах, которые все еще используются.? – Nitin4Android

1

Я встретил ту же проблему в KitKat. Исправление: change options.inInputShareable от 'true' до 'false' в BitmapAjaxCallback.java Каждое растровое изображение, загруженное с любого URL-адреса, сохраняется в файле. И если inInputShareable истинно, ваш процесс имеет дублированный файловый дескриптор для совместного использования. Поэтому, когда> 1024 файла дескрипторы утечка, EMFILE происходит. Но на самом деле я не могу понять, почему он работал правильно перед KitKat :)

P.S. inInputShareable = ложные произведения, как inPurgeable = ложь и приводит к быстрым ООМУ :( Правильного исправления в AQuery является изменение вызова BitmapFactory.decodeFileDescriptor к BitmapFactory.decodeByteArray (Не используйте decodeStream !!! Он игнорирует inPurgeable несмотря на JavaDocs)

И я обнаружил, что проблема связана с ошибкой в ​​KitKat: https://code.google.com/p/android/issues/detail?id=65638