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

Remove White screen in Oracle MAF applications

我在我的应用程序中使用跳板并且有多个任务流。因此,每当我从一个功能切换到另一个功能时,白屏闪烁屏幕就会出现 feature.This 屏幕中的任务流程变化也出现在 MAF 示例中,oracle.I 也给出了想要删除的白屏短时间内第一次加载任务流 feature.Please回复我怎样才能实现。

jdeveloper 版本:12.1.3

maf : 2.2.2

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

Post 编辑以回应 Anand 的后续回答。

别担心,下面是您遇到的问题的详细信息。我将尝试描述它发生的原因,以及您可以如何更改您的应用程序以减少此问题。虽然描述很长,但要进行这些更改其实并不难,只是需要大量的文字来解释!

此外,我建议您在没有进行完整的回归测试之前不要将这些更改永久化。这些更改将从根本上改变您的应用程序的组成方式,因此我不能保证它不会破坏您的某些逻辑。为了让您进行这些更改并确信没有任何问题,您还需要在进行更改之前进行全面的回归测试,然后将其与post-更改回归测试,因此您可以区分现有问题和这些更改引入的新问题。

因此,让我们退后一步,描述问题发生的原因。

首先,正如您所注意到的,问题会在应用程序第一次打开时发生,并且在您第一次打开具有关联任务流的功能时发生。如果您有一个包含许多功能的跳板,当您在这些功能之间跳过并且它们都是第一次启动时,您会看到每个功能都有这个白色闪光(只有第一次,而不是在每次重新打开时)。它还会稍微延迟导航到该任务流,具体取决于您设备的速度。

其次,这个问题在速度较慢的设备上或在没有 HAXM 的 Android 模拟器中会更加明显,因为它与性能瓶颈有关。由于 MAF 在 iOS 上运行得更快,所以根本很难发现这个问题,而在现代 Android 设备上又很难看到,因为它太快了。例如,在我的旧版 1.5Ghz 第二代 2013 Nexus 7 平板电脑上,我可以看到白色闪光,大多数现代 Android 手机都有 2Ghz+ 处理器,我已经没有真正注意到这个问题了。反过来,作为开发人员,您会更频繁地看到闪光灯,因为您将不断终止和重新部署应用程序,这会导致应用程序重新启动,并且闪光灯会在应用程序和每个功能首次出现时再次出现 opened/restarted。 (真正的用户很少会看到这种情况,因为他们倾向于坚持使用大多数应用程序中的一些功能,并将应用程序 运行 留在后台,以便这些功能已经初始化)

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

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

一旦某个功能被初始化,它的渲染速度就会快得多,而且您不太可能看到闪光灯,因为现在一切都已安全初始化。换句话说,该问题仅在第一次呈现某个功能时才会引起注意。如果您重新打开该功能,将很快看到类加载器已经加载。

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

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

如果您考虑 MAF 应用程序,您通常会有 1 个跳板功能,然后是应用程序各个有用部分的许多其他功能。我们称其为“跳板”特征(单数)和“逻辑”特征(复数)。

因此解决方案是:

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

2) 对于当前的 springboard 功能,它将保留,但我们需要更改其工作方式。

通常情况下,客户会创建一个带有列表视图的跳板功能来导航到他们的功能(而不是使用自动生成的跳板)。由于我们的目标是消除逻辑功能并用新的单一逻辑功能替换它们,因此原始跳板将无法工作,因为它旨在调用其他原始的单个业务功能(而不是我们新的超级单一逻辑功能)。

相反,我们需要做的是使用 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"/> 

所以感觉解释很多,但真的是3步。完成这些然后满意地测试应用程序后,您可以开始消除冗余的原始逻辑功能+任务流程。不要删除任何 AMX 页面、pageDef 或 bean,只需删除冗余功能和任务流。

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

而且你真的需要考虑这是一个大问题吗,你真的应该着手解决这个问题吗?就个人而言,在 Android 和更快的 Android 设备上使用最新优化版本的 MAF 我已经有一段时间没有看到这个问题了。基本上,白色闪光非常快,以至于不再是一个明显的问题。反过来,由于真正的移动用户将应用程序 运行 保留在后台,他们只看到一次这个问题,并且在他们终止应用程序并重新启动之前一段时间内不会再看到它。因此,您需要考虑是否解决了大多数客户可能看不到的问题。