1

我想UiApplication.activate()在 BlackBerry 中使用该方法。在Android中,我们使用onResume()方法;那么我们如何UiApplication.activate()在黑莓中使用该方法呢?

没有那么多可用的信息。

4

2 回答 2

4

由于彼得答案下方的评论,很难回答这个问题。 Android 中的Activity#onResume()通常不会简单地用于“在进行更改后当场刷新 ... UI 数据”

安卓

onResume()Activity当用户返回(返回)到;时由 Android 操作系统调用 这通常发生在离开它之后......要么是因为另一个 Activity 显示在它前面,要么是因为用户离开了您的应用程序并回到它(回家和回来,手机又回来等)

在此处输入图像描述

黑莓

在 BlackBerry 中,Application#activate()当用户返回您的应用程序时调用。此回调发生在应用程序级别。Android 中的应用程序由许多 Activies 组成(通常)。 onResume()当用户返回到该单独的 Activity时,会为您应用中的每个 Activity 单独调用。

虽然不相同,但 BlackBerry 中的一个类似构造是Screen类。一个应用程序可能有许多屏幕,因为 Android 应用程序有许多活动。因此,如果您正在寻找与 最相似的东西onResume(),我会尝试,正如彼得建议的那样

为了最接近onResume(),您可能需要这两种方法,因为一次显示时不会Screen#onExposed()调用(而确实如此)。您将在您自己的扩展(或等)的类中覆盖这些方法ScreenActivity#onResume()ScreenMainScreen

如果您的问题只是确定何时刷新 UI,则需要详细说明您正在使用哪种 UI 对象(字段),以及何时获得新数据来显示。

更新:

下面是一些示例代码,介绍如何构建主Screen类,以尝试模仿 Android 的onResume()回调:

public final class MyScreen extends MainScreen {
   public MyScreen() {        
      setTitle("MyTitle");
   }

   protected void onExposed() {
      super.onExposed();
      onResume();
   }

   protected void onUiEngineAttached(boolean attached) {
      super.onUiEngineAttached(attached);
      if (attached) {
         onResume();
      }
   }

   private void onResume() {
      // TODO: put your Android-like processing here
      System.out.println("onResume()");
   }
}
于 2013-11-01T21:39:49.843 回答
3

关于activate(),没有什么可真正了解的。如果您查看文档

http://www.blackberry.com/developers/docs/7.1.0api/net/rim/device/api/system/Application.html

它说:“系统在将此应用程序带到前台时调用此方法。”

因此,如果您的应用程序已被推送到后台(例如,通过电话),然后用户单击您的图标再次查看您的应用程序,那么将调用 activate()。相反,当系统将您的应用程序推送到后台时(例如,收到电话时),将调用 deactivate()。

请注意,首次启动应用程序时也会调用 activate()。

问题实际上是您需要在 BlackBerry 代码中复制的 onResume() 中做什么。如果您能告诉我们这一点,我们可能会建议什么是实现您想要的结果的最佳方法。

更新

鉴于您似乎正在使用 onResume() 来更新 Ui,不幸的是,没有一种简单的方法可以为整个应用程序执行此操作。您将使用的方法实际上取决于要更新的​​内容。

但请注意,大多数字段会在您更改其内容时自动更新。举一个简单的例子,如果你有一个包含数据的 EditField,并且你使用 .setText("new data"); 方法,这将自动为您在屏幕上重新绘制该字段。

我希望您有一个从数据库或数据源填充的屏幕,并且您希望在 activate() 中刷新此数据。因此,您必须遍历屏幕的每个字段并使用相关的 set... 方法来更新内容。

这有点问题,因为激活是为应用程序调用的,而不是屏幕,并且您可能在堆栈上有多个屏幕,您确实需要更新所有这些有多种方法可以做到这一点,例如,您的屏幕注册自己以进行更新,或者您的 activate() 方法在显示堆栈中搜索那里的屏幕。

但可能一种简单的方法是使用每个屏幕的“onExposed()”方法来自动更新内容。只要屏幕被隐藏然后显示,这个方法就会被调用,这正是应用程序被前景化后会发生的事情。当屏幕被另一个屏幕被推到屏幕上时,或者甚至是用户按下菜单键时,也会发生这种情况。因此,如果更新很耗时(例如需要数据库查找),您可能不想在每次调用 onExposed() 时都更新,而是尝试限制更新频率。

这种“onExposed()”方法并没有摆脱单独更新每个字段内容的要求,但它可能更容易实现。

进一步更新

请注意 Nate 的回答,Nate 具有 Android 和 BB 的经验,因此可以更好地解决您的问题。

但是,如果您知道屏幕已更新,因此您刚刚处理了与屏幕内容相关的网络请求,那么您应该单独浏览每个字段,“设置”当时的更新值,不要'不用担心使用 onExposed()。适应这种情况的一种设计方法是将屏幕构造与屏幕人口分开,因此您可以从多个位置调用“人口”(请注意,当您更新字段时,您确实需要在事件线程上)。

但是在这种情况下,您可能会发现创建一个新屏幕并推送它并弹出旧屏幕(具有旧值)更容易和更快。

于 2013-11-01T09:33:43.820 回答