【问题标题】:Call method in activity behind current foreground activity在当前前台活动后面的活动中调用方法
【发布时间】:2018-06-18 10:25:30
【问题描述】:

我正在尝试在我的应用程序中创建一个“自动刷新”功能 - 因此,如果一个活动或片段在后台超过两分钟,它会在进入前台时自动从 api 获取新数据。

但是,我有一个案例,即 Activity A 中的 Fragment A 执行 api 调用并在列表中显示数据。单击特定列表元素时,您将进入活动 B,其中显示了更多信息。

问题是 - 当活动 B 在后台至少两分钟后进入前台时,而不是对特定列表元素进行 api 调用 - 我宁愿只获取整个列表(它是动态的,通常很短) 并且理想情况下使用与片段 A 中的初始提取相同的代码。

是否可以从 Fragment A 中的 Activity B 调用方法?我该怎么做?之后我如何将数据传回 Activity B 以更新那里的 UI?

所以我有一个看起来像这样的堆栈:

活动 B(前台)

Activity A 中的片段 A

我想从 Activity B 调用 Fragment A 中的一个方法,并在 http 请求响应时向 Activity B 报告。

提前致谢,如果有什么需要详细说明的,请告诉我。

【问题讨论】:

  • @vishwarajanand 情况不太一样——在提到的问题中,他有一个包含 5 个片段的活动。我有两个活动 - 一个包含所述片段,另一个包含列表元素视图。我会调查这个问题,看看有什么我可以使用的。感谢您的回答。

标签: java android back-stack


【解决方案1】:

您可以尝试以下解决方案:

在活动 A 的片段 A 中编写一个公共静态方法并从活动 B 调用它 => 但在活动 B 中处理显示结果的方法的输出很重要 对于共享数据,您可以使用 SharedPreferences、本地存储或静态变量。

【讨论】:

  • 静态方法可能是一种解决方案——我只是觉得要么应该有一些 Android 工具来做这件事——要么出于某种我无法弄清楚的原因,这是不好的做法。关于静态方法,我觉得它不是最好的解决方案,因为我想确保更改发生在正确的 Activity A/Fragment A 实例上,但我会尝试实现它,看看它是否有效。谢谢你的回答。
【解决方案2】:

没有必要从Activity B调用Activity A->Fragment A的方法,只是为了在两秒后刷新数据。 您可以在 Fragment A 或 Activity A 的 onPause 方法中启动一个线程(根据您的需要)。然后在 onResume 中停止该线程。

//field
private Handler handler;
private Runnable runnable;

private void getDataFromNetwork(){
   handler = new Handler();
   runnable = new Runnable() {
     @Override
     public void run() {
        //Do something after 2000ms

       //call this method to again schedule this thread after 2000ms.
       handler.postDelayed(this, 2000);
   }
 };

   handler.postDelayed(runnable, 2000);
}

在 onResume 中只删除此方法的回调。

handler.removeCallbacks(runnable);

但是在使用这种方法时,请始终记住从处理程序中删除回调,否则它将成为悬空线程并导致内存泄漏。

【讨论】:

  • 这不是一个坏主意。但是,我不想在 2 分钟后(尤其是 2 秒后)拨打电话 - 我想在活动在后台运行超过 2 分钟后进入前台时拨打电话。这个想法是,如果它已经在后台超过 2 分钟,它可能已经在后台有一段时间了 - 因此它需要刷新。有意义吗?
  • 所以只需将其替换为 120000 2 分钟。您将在 ActivityA 的 onPause 中调用线程,该线程将在 Activity 处于后台时调用
  • 哎呀,所以如果 Activity A 在后台超过 2 分钟,您只想刷新它,对吧?在这种情况下,只需将 System.currentTimeMillis() 保存在 ActivityA 的 onPause 和 ActivityA 的 onResume 中,再次将上次保存的时间与当前时间进行比较并完成工作
  • 是的,但棘手的部分是我还想在 Activity B 中“重用”来自 Activity A 的刷新逻辑。我想我已经设法通过创建另一个类来使其工作,当我测试它时,我会在这里发布我的解决方案。感谢您的回答!
【解决方案3】:

你可以使用

@Override
public void onResume(){
    super.onResume();
    //Get value from api and update UI...
}

【讨论】:

  • 这正是我在大多数活动中所做的。但是在这种情况下,我想在 Activity B 恢复时调用 Fragment A 中的方法,在 Activity A 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多