Ананд, мы (я сотрудник Oracle) недавно получил подобный вопрос внутреннего к Oracle от поддержки Oracle от имени клиента , Предположительно, этот клиент был у вас, и у вас уже есть ответ. Сообщите нам иначе.
Опубликовать редактирование в ответ на ответ Ананда.
Не беспокойтесь, вот подробности проблемы, которую вы видите. Я попытаюсь описать, почему это происходит, и как вы можете изменить свое приложение, чтобы уменьшить эту проблему. Хотя описание длинное, на самом деле не так сложно сделать эти изменения, это просто требует много слов, чтобы объяснить!
Кроме того, я рекомендую вам НЕ Внести эти изменения в постоянное состояние без ПОЛНОГО РАУНДА ИСПЫТАНИЯ РЕГРЕССИИ. Эти изменения коренным образом изменит ваше приложение, поэтому я не могу гарантировать, что это не нарушит некоторые из ваших логических схем. Для того, чтобы вы сделали эти изменения и убедились, что ничего не сломалось, вам также необходимо выполнить ПОЛНЫЙ РАУНД РЕГРЕССИОННОГО ИСПЫТАНИЯ до, вы внесете изменения, а затем сравните его с результатами теста после регрессии, поэтому вы могут отличаться от существующих проблем и новых проблем, возникающих в результате этих изменений.
Итак, давайте сделаем шаг назад и опишем причину возникновения проблемы.
Во-первых, поскольку вы заметили, что проблемы возникают при первом открытии приложения и при первом запуске функции с связанным потоком задач. Если у вас есть трамплин с множеством функций, когда вы пропускаете функции, и каждый из них запускается в первый раз, вы увидите эту белую вспышку для каждого (только в первый раз, а не при каждом последующем повторном открытии). Это также немного задерживает навигацию к этому потоку задач в зависимости от скорости вашего устройства.
Во-вторых, эта проблема будет гораздо более заметной на более медленных устройствах или в эмуляторе Android без HAXM, поскольку это связано с узким местом производительности. Поскольку MAF работает быстрее на iOS, это трудно понять эту проблему, и на современных устройствах Android, в свою очередь, это трудно понять, поскольку это слишком быстро. В качестве примера на моем более раннем планшете Nexus 7 на втором поколении 2013 года я вижу белую вспышку, у большинства современных телефонов Android есть процессор 2 ГГц +, и я больше не замечал эту проблему. В свою очередь, как разработчик вы будете видеть вспышку чаще, так как вы будете постоянно убивать &, перераспределяя приложение, что приводит к перезапуску приложения и флэш-памяти, появляющейся при первом запуске приложения &, каждая функция снова открывается/перезапускается. (реальные пользователи будут видеть это гораздо реже, поскольку они склонны придерживаться нескольких функций в большинстве приложений и оставляют приложение в фоновом режиме, чтобы функции уже были инициализированы)
Так почему же происходит вспышка, и связанные задержки в навигации?
Когда функция сначала вызывается, MAF инициализирует несколько вещей в фоновом режиме, включая загрузчик классов за функцию.Эта инициализация по какой-либо причине является дорогостоящей с точки зрения производительности, и во время обработки может привести к удалению пользовательского интерфейса, который приводит к белым экранам. Я использую этот эффект как «белая вспышка экрана».
После того, как функция была инициализирована, скорость, при которой она отображается, намного быстрее, и вы вряд ли увидите вспышку, так как теперь все безопасно инициализировано. Другими словами, проблема проявляется только в том случае, когда впервые создается функция. Если вы повторно откроете эту функцию, она будет слишком быстрой, чтобы увидеть, как загрузчик классов уже загружен.
Как мы теперь знаем, что вызывает проблему, что мы можем сделать, чтобы избежать этого, предполагая, что Oracle не будет исправлять или оптимизировать проблему? (А в справедливости команда разработчиков MAF сделал оптимизировать MAF сильно в версии 2.2).
В конечном итоге решение состоит в том, чтобы уменьшить количество функций в вашем приложении и, в конечном счете, (если возможно) уменьшить это до 1 функции, поэтому при запуске приложения вы получите белую вспышку один раз, но не снова. Но это вызывает вопрос, когда MAF подталкивает вас к использованию функций, вызванных трамплином, как вы это делаете? Можем ли мы действительно уменьшить все функции?
Если вы думаете о своем приложении MAF, у вас обычно будет 1 функция для трамплина, а затем множество других функций для различных полезных частей вашего приложения. Назовем функцию «трамплина» (единственная) и «логические» функции (множественное число).
Таким образом, решение заключается в следующем:
1) переместить все из существующих логических функций (но функция трамплина), то есть все страницы AMX, а также другие компоненты, такие как управляемый компонент в вашей задаче перетекает в 1 новая единая логическая функция. Для каждой из существующих ранее логических функций, которые теперь встроены в эту единственную новую логическую функцию, создайте подстановочную навигацию для каждого, чтобы к ней можно было получить доступ и дать каждому имя. например. goFirstFeature, goSomeOtherNameFeature и т. д.
2) для текущей функции трамплина он останется, но нам нужно изменить, как он работает.
Обычно клиенты создают функцию трамплина со списком, чтобы перейти к своим функциям (вместо использования автогенерируемого трамплина). Поскольку наша цель - устранить логические функции и заменить их новой единой логической функцией, оригинальный трамплин не будет работать, поскольку он предназначен для вызова других оригинальных индивидуальных бизнес-функций (а не нашей новой супер-единой логической функции).
Вместо этого нам нужно сделать hardcode ListView с ListItems для вызова каждой отдельной (логической) функции в нашей новой единой логической функции с использованием подстановочных знаков. Что-то вроде следующего:
<amx:commandButton text="Go First Feature" id="cb1" actionListener="#{viewScope.myBean.goFirstFeature}"/>
<amx:commandButton text="Go Second Feature" id="cb2" actionListener="#{viewScope.myBean.goSecondFeature}"/>
Это поддерживается бобе со следующим кодом:
public class MyBean {
private void doFeatureNavigation(
String featureId, String navigationFlowCase) {
AdfmfContainerUtilities.hideSpringboard();
AdfmfContainerUtilities.invokeContainerJavaScriptFunction(featureId,
"adf.mf.api.amx.doNavigation", new Object[] { navigationFlowCase });
}
public void goFirstFeature(ActionEvent actionEvent) {
doFeatureNavigation("package.name.of.new.single.logic.feature", "goFirstFeature");
}
public void goSecondFeature (ActionEvent actionEvent) {
doFeatureNavigation("package.name.of.new.single.logic.feature", "goSecondFeature");
}
}
Обратите внимание, как код скрывает трамплин, то в контексте одной функции бизнес переходит к одной из правила навигации по диким картам, которые вы устанавливаете ранее в новой единой логической функции.
3), если любой из ваших существующих логических функций имеет AMX страниц с элементами управления командой для перехода к любой другой логике функциям, вам нужно будет изменить код для вызова символы:
<amx:commandButton id="cb5" action="goFirstRequest"/>
Так он чувствует, как много объяснений, но это действительно 3 шага.Сделав это, тогда удовлетворительно протестировав приложение, вы можете начать устранять избыточные исходные логические функции + потоки задач. Не удаляйте никаких страниц AMX, pageDefs или beans, просто удаляйте избыточные функции и потоки задач.
Я сделал много предположений по пути здесь, предлагая решение, поскольку я не видел ваше приложение. Но я надеюсь, что это даст вам ощущение того, что такое решение.
А также вам действительно нужно подумать, что это большая проблема, и вы действительно должны принять решение. Лично с последними оптимизированными версиями MAF на Android и более быстрыми устройствами Android я не видел эту проблему в течение некоторого времени. В принципе, белая вспышка настолько быстра, что это уже не является заметной проблемой. В свою очередь, поскольку настоящие мобильные пользователи поддерживают приложение, работающее в фоновом режиме, они видят эту проблему один раз и больше не будут видеть его некоторое время, пока не убьют приложение и не перезапустят его. Поэтому вам нужно подумать о том, что вы исправляете проблему, которая не может быть замечена большинством ваших клиентов.
Благодарим вас за ответ, но вы ошибаетесь ... Это был не я, и у меня нет ответа на вопрос, который я задал. –
Если у вас есть ответ, сообщите мне ... –
Я только что скопировал вопрос. –