gpt4 book ai didi

java - 为什么可运行的回调会自动销毁 Activity ?

转载 作者:IT老高 更新时间:2023-10-28 23:23:41 26 4
gpt4 key购买 nike

我想知道我们是否有可能在 android 上处理/检测带有延迟的可运行回调(postDelayed 方法)?

例如,我的应用程序(用于测试目的的应用程序)上有一个或多个启动画面(与 handler.postDelayed(new Runnable()... 一起运行)。在这个应用程序中,我有还有一个库(我在应用程序中创建和使用它)和一些可用的类,这些类在 IntentService 类上运行。

有时,当应用程序运行那些 splashscreen Activity (用于测试目的)时,我正在创建的库可能会在 UI 中自动弹出一些 Activity 。但是,如果这些 Activity 出现在 splashscreen Activity 上并且 splashscreen 正在被销毁,那么这些 Activity (自动弹出)也将被销毁并记录 “泄漏窗口” logcat 中的消息。

问题是:

  • 那些自动出现在 UI 中的 Activity 不应该是自动关闭,这是禁止的。它需要一个交互用户关闭该 Activity 并返回应用程序的正常行为。
  • 此外,该库对应用程序的用户界面一无所知。

所以我的问题是(相对于我正在创建的库方面,而没有关于 UI 应用程序流程的信息):

  • 有没有办法检测是否在应用程序中相对于库端创建了一些 postDelayed 方法?如果是,我该如何处理这个问题?

P.S.:请注意,通常情况下,我正在为自动出现的假设 Activity 使用 Dialog。

更新

Diagram

图表说明:

现在我有一个 Splashscreen 正在执行的案例。

扩展 IntentService 类的类已收到来自 Internet 的请求,该请求将启动 Activity

同时启动画面在 postdelayed 上,另一个 Activity 已创建并显示在 UI 中。当 X 秒过去且另一个 Activity 尚未销毁时,将创建 Next Activity 并自动销毁另一个 Activity。这样做时,Android 会相对于 Activity 抛出“泄漏窗口”消息。

最佳答案

Is there a way to detect if some postDelayed method was created in the application relatively to the library side?

您可以使用MessageQueue.IdleHandler API。见 LooperIdlingResource espresso 如何判断是否是触发断言的适当时间。


@Override
public boolean queueIdle() {

QueueState queueState = myInterrogator.determineQueueState();
if (queueState == QueueState.EMPTY || queueState == QueueState.TASK_DUE_LONG) {
...
} else if (queueState == QueueState.BARRIER) {
...
}

return true;
}

这将帮助您了解 MessageQueue 中是否有消息,但它不会告诉您确切的消息是什么。

我要采用的解决方案是取消计划 Runnable 您在 Activity 的 onStop 中具有 postDelayed 的时间,因为如果 Activity(来自库的那个)已经启动,比 SplashScreenonStop 被调用:


public class SplashActivity extends AppCompatActivity {

private final Runnable myRunnable = () -> {
// launch `NextActivity`
};
private final Handler handler = new Handler();

@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);

handler.postDelayed(myRunnable, 3000);
}

@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(myRunnable);
}

}

关于java - 为什么可运行的回调会自动销毁 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45710056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com