删除Oracle MAF应用程序中的白色屏幕



我在应用程序中使用跳板,并且有多个任务流。所以,每当我从一个功能切换到另一个功能时,功能之间的任务流变化就会出现一个白色屏幕闪烁。这个屏幕也出现在oracle给出的MAF示例中。我想删除第一次加载任务流时出现的短暂的白色屏幕特色请回复我,我如何才能实现它。

jdeveloper版本:12.1.3

maf:2.2.2

Anand,我们(我是Oracle员工)最近代表一位客户从Oracle支持部门收到了一个类似的Oracle内部问题。大概那个客户就是你,你已经有了答案。否则请告诉我们。

根据Anand的后续回答进行后期编辑

不用担心,以下是您看到的问题的详细信息。我将尝试描述为什么会发生这种情况,以及如何可能更改应用程序以减少此问题。虽然描述很长,但做出这些改变其实并不难,只需要用很多词来解释!

此外,我建议您不要在没有进行全面回归测试的情况下使这些更改永久化。这些变化将从根本上改变你的应用程序的组成方式,所以我不能保证它不会破坏你的一些逻辑。为了使您能够做出这些更改并确信没有任何更改,您还需要在做出更改前进行一轮完整的回归测试,然后将其与更改后回归测试的结果进行比较,以便您能够区分现有问题和这些更改带来的新问题。

因此,让我们退一步来描述为什么会出现此问题。

首先,正如您所注意到的,问题发生在第一次打开应用程序时,以及第一次打开具有关联任务流的功能时。如果你有一个有很多功能的跳板,当你在功能之间跳跃,并且每个功能都是第一次开始时,你会看到每个功能的白色闪光(只是第一次,而不是在随后的每次重新打开时)。它还会根据设备的速度略微延迟导航到该任务流。

其次,这个问题在速度较慢的设备上或在没有HAXM的Android模拟器中会更加明显,因为它与性能瓶颈有关。由于MAF在iOS上运行得更快,很难看到这个问题,而在现代安卓设备上也很难看到,因为它太快了。例如,在我的旧款1.5Ghz第二代2013 Nexus 7平板电脑上,我可以看到白色闪光灯,大多数现代安卓手机都有2Ghz以上的处理器,我再也没有真正注意到这个问题了。反过来,作为一个开发者,你会更频繁地看到闪光,因为你会不断地杀死&重新部署该应用程序,这导致该应用程序的重新启动以及该应用程序第一次出现的闪光灯&再次打开/重新启动每个功能。(真正的用户会很少看到这种情况,因为他们倾向于在大多数应用程序中坚持几个功能,并让应用程序在后台运行,因此这些功能已经初始化)

那么,为什么会出现闪光,以及相关的导航延迟呢?

当一个功能首次被调用时,MAF会在后台初始化许多东西,包括每个功能的类加载器。无论出于何种原因,这种初始化在性能方面都是昂贵的,并且在处理过程中可能会导致UI被清除,从而导致白色屏幕。我把这种效果称为"白色屏幕闪光"。

一旦一个功能被初始化,它渲染的速度就会快得多,而且你不太可能看到闪光灯,因为现在一切都被安全地初始化了。换句话说,这个问题只有在第一次渲染特征时才明显。如果重新打开该功能,它会很快看不到类加载器已经加载。

正如我们现在所知道的是什么导致了这个问题,假设Oracle不会修复或优化这个问题,我们该怎么做才能避免这种情况?(公平地说,MAF开发团队确实在2.2版本中对MAF进行了大量优化)。

最终的解决方案是减少应用程序中的功能数量,并最终(如果可能的话)将其减少到只有一个功能,这样当应用程序启动时,你会得到一次白色闪光,但不会再次。但这就引出了一个问题,当MAF促使你使用跳板调用的功能时,你该如何做到这一点?我们真的能减少所有功能吗?

如果你考虑一下你的MAF应用程序,你通常会有一个跳板功能,然后是应用程序中各种有用部分的许多其他功能。让我们称之为"跳板"特征(单数)和"逻辑"特征(复数)。

因此,解决方案是:

1) 将所有内容从现有的逻辑功能(跳板功能除外)(即所有AMX页面)和其他组件(如任务中的托管bean)移动到一个新的单个逻辑功能中。对于现在嵌入到单个新逻辑特性中的每个预先存在的逻辑特性,为每个特性创建一个通配符导航,以便可以访问它们,并为每个特性指定一个名称。例如goFirstFeature、goSomeOtherNameFeature等

2) 对于目前的跳板功能,它将保持不变,但我们需要改变它的工作方式。

通常,客户会创建一个带有列表视图的跳板功能,以导航到他们的功能(而不是使用自动生成的跳板)。由于我们的目标是消除逻辑功能,并用新的单一逻辑功能取而代之,因此最初的跳板不会起作用,因为它被设计为调用其他原始的单个业务功能(而不是我们新的超级单一逻辑功能)。

相反,我们需要做的是使用ListItems对ListView进行硬编码,以使用通配符调用新的单个逻辑功能中的每个单独(逻辑)功能。类似以下内容:

<amx:commandButton text="Go First Feature" id="cb1" actionListener="#{viewScope.myBean.goFirstFeature}"/> 
<amx:commandButton text="Go Second Feature" id="cb2" actionListener="#{viewScope.myBean.goSecondFeature}"/> 

这是由具有以下代码的bean支持的:

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"/> 

所以这感觉像是很多解释,但实际上是三个步骤。完成这项工作后,对应用程序进行了令人满意的测试,您可以开始消除冗余的原始逻辑功能+任务流。不要删除任何AMX页面、pageDef或bean,只删除多余的功能和任务流。

在提出解决方案的过程中,我做了很多假设,因为我还没有看到你的应用程序。但我希望这能给你一个解决方案的味道

你真的需要考虑的是,这是一个大问题,你真的应该采取解决方案吗。就我个人而言,在安卓系统上的MAF的最新优化版本和更快的安卓设备上,我已经有一段时间没有看到这个问题了。基本上,白色闪光是如此之快,以至于它不再是一个明显的问题。反过来,当真正的移动用户让应用程序在后台运行时,他们只会看到一次这个问题,直到他们杀死应用程序并重新启动,才会再次看到它。因此,你需要考虑你是否在解决大多数客户可能看不到的问题。

最新更新