1С мобильное приложение падает из за нехватки памяти Java

1. ZIGRAS 28.02.18 02:36 Сейчас в теме
При работе в мобильном приложении с большим количеством картинок рано или поздно 1с падает с ошибкой о нехватке памяти. ВременноеХранилище при закрытии форм отчищается. Есть у кого ни будь умные мысли как с этим бороться. Или это крест мобильной платформы и исправление стоит ждать когда Обама снова станет президентом) Вот ошибка:
java.lang.OutOfMemoryError: Failed to allocate a 630996 byte allocation with 439192 free bytes and 428KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:831)
at android.graphics.Bitmap.createBitmap(Bitmap.java:808)
at android.graphics.Bitmap.createBitmap(Bitmap.java:739)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:615)
at com.e1c.mobile.c.a(Unknown Source)
at com.e1c.mobile.UIView.onDraw(Unknown Source)
at android.view.View.draw(View.java:16184)
at com.e1c.mobile.UIView.draw(Unknown Source)
at android.view.View.updateDisplayListIfDirty(View.java:15180)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.View.draw(View.java:15954)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16187)
at com.e1c.mobile.UIView.draw(Unknown Source)
at android.view.View.updateDisplayListIfDirty(View.java:15180)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.View.draw(View.java:15954)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16187)
at com.e1c.mobile.UIView.draw(Unknown Source)
at android.view.View.updateDisplayListIfDirty(View.java:15180)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
at android.view.View.updateDisplayListIfDirty(View.java:15140)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2614)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2433)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2066)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1112)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6029)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5480)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FesenkoA 59 28.02.18 15:11 Сейчас в теме
Я думаю Обама вам таки не поможет, вам же не подъезды осквернять нужно, а 1С своим творчеством))) А вот мастерская дядюшки Цинь Ляо вам поможет: рут телефона, приоритет аппликейшона 1С на максимум (чтобы андроид его не "убивал"), и виртуальную память поднять тоже посильнее. Ну и для большого неба - большие самолеты, а не старички 2014-15 гг выпуска.

ИЛИ записывать свои данные почаще, разбивать видео на фрагменты, для этого вам поможет "обработчикОжидания" и "объект.Записать()".

Если нужны приложения - пишите, вечером в истории загрузок поищу
3. AlexO 136 28.02.18 18:26 Сейчас в теме
Разбивать на части, и отправлять всю обработку на сервер.
.
4. ZIGRAS 28.02.18 23:25 Сейчас в теме
Спасибо за нотку оптимизма) Вся каша варится в обработке. Загружается прайс с центральной базы через web и записывать там нечего. Приложение для сотрудников, партнеров и в дальнейшем для розничных пользователей. Соответственно все должно быть Plug&Play. Ломать хребет андройду пользователи не смогут) В моем понимании если я закрываю форму обработки, да и саму обработку память должна отчищается, но на деле память накапливается и даже после непродолжительного юзанья обработки при ее закрытии и повторном открытии все надежды разбиваются об веру в мобильное приложение 1С) Можно ли как то из 1с влиять на ее очищение перед кодом праведным)
5. FesenkoA 59 01.03.18 15:32 Сейчас в теме
(4) Берите пример с Нова Пошта: их АПИ выдает по 500 результатов на запрос, и параметр №3 - номер "страницы".

N=0; 
Пока Истина цикл
ОТвет=Вебсервис.получитьДанные(х,у,z,N)
Если ответ.Количество()=0 тогда
прервать
//загружаете данные
//Выдавайте ХХХ результатов на сервере
N=N+1;
Конеццикла
Показать


Потом очищайте вручную все переменные, то есть а=неопределено,б=неопределено итд
6. ZIGRAS 01.03.18 16:11 Сейчас в теме
Фотографии сжаты до 30 кб. При ответе сервер передает одновременно размер фотографий. Вобщем 1 форма выдерживет 7000кб. Поэтому после 5000кб (с запасом) я сделал открытие новой подчиненной формы (страницы). До 3 страниц открывает спокойно.

С каждым открытием новой подчиненной страницы я отчищаю ссылки на фото текущей.
СсылкиФотоВХранилище      = ЭтаФорма.СсылкиФотоВХранилище;
Для Каждого ТекСсылка Из СсылкиФотоВХранилище Цикл
     ЭтотОбъект[ТекСсылка.Значение] = Неопределено;
КонецЦикла; 


При возвращении на эту страницу востанавливаю фото
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "Прайс" + Строка(ТекущаяСтраница) Тогда
        СсылкиФотоВХранилище      = ЭтаФорма.СсылкиФотоВХранилище;
        Для Каждого ТекСсылка Из СсылкиФотоВХранилище Цикл
            ЭтотОбъект[ТекСсылка.Значение] = ТекСсылка.Представление;
        КонецЦикла;         
    КонецЕсли;
    
КонецПроцедуры

Показать

При закрытии на всякий случай отчищаю ВременноХранилище (хотя это должно проходить автоматически т.к. во ВременномХранилище Ид формы)
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
        СсылкиФотоВХранилище      = ЭтаФорма.СсылкиФотоВХранилище;
        Для Каждого ТекСсылка Из СсылкиФотоВХранилище Цикл
            УдалитьИзВременногоХранилища(ТекСсылка.Представление);
        КонецЦикла;         

КонецПроцедуры
Показать


Если все закрыть и начать заново, то через какое то время все валится. Помогает только полное закрытие и открытие приложения
7. ZIGRAS 01.03.18 16:15 Сейчас в теме
И да все эти манипуляции значительно продлевают жизнь приложения, но все равно остается определенный лимит открытий до падения
8. FesenkoA 59 02.03.18 10:40 Сейчас в теме
(7) хмм, у меня была передача фоток "все разом", нас было 9 тел, а фоток приблизительно 900, то есть по 100 фоток (читай по 100 мб) в пакете, и не валилось. тогда
1) попробуй даунгрейд до 8.3.6, ибо все было на ней
2) тебе нужно именно выводить? записывай каждую фото как есть (хранище значения=хранилище значения), а выводи не все пачкой на странице, а как то динамически выводить
3) попробуй рутануть и "апгрейдить" свой аппарат. Если МП с смартфоном ведет себя как 7.7 с многоядерным процессором - то есть берет сколько ресурсов, сколько написано в коде и плевать что это 9s гелекси, то....
9. ZIGRAS 02.03.18 16:23 Сейчас в теме
Валится при выводе на ЭлементФормы картинка. Примерно получается после 500 фоток. На одной форме вывожу по 150 картинок. Для оперативности каждый вызов по 30 штук, далее кнопка "показать еще" т.к. для самой формы событие конца формы нет (а его так не хватает). Пробовал сейчас дополнительно удалять все элементы и реквизиты, тоже самое. На 6 и 7 Андройде тоже самое. Живых ссылок на 8.3.6 найти не могу. Они наверно в одном плосту с динозаврами). А можно поподробней "записывай каждую фото как есть (хранище значения=хранилище значения)"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот