gpt4 book ai didi

android - Activity 线程结束后, Activity 没有停止

转载 作者:行者123 更新时间:2023-12-03 13:16:37 25 4
gpt4 key购买 nike

我有一个启动屏幕,在其中运行动画。以下是我从启动画面转到MainActivity的逻辑。

启动画面的最小可见时间= minTime
启动画面的最大可见时间= maxTime
调用API会在一段时间内获得响应-apiTime

1. 显示至少minTime的启动画面

2. 调用API。如果收到的API响应少于maxtime
立即移至下一屏幕,否则,移至中的下一屏幕
maxtime
以下是我的代码:

public class SplashActivity extends AppCompatActivity {

private ImageView container;
private AnimationDrawable animationDrawable;
int apiTime = 2000, minTime = 1000, maxTime = 5000;

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

container = findViewById(R.id.iv_icons);
container.setBackgroundResource(R.drawable.splash_animation);

animationDrawable = (AnimationDrawable) container.getBackground();
}

@Override
protected void onResume() {
super.onResume();
animationDrawable.start();
final long start = System.currentTimeMillis();

//calling api in thread simultaneously. As soon as response is received, move to next screen.
//Thread.sleep is just dummy for api response time
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(apiTime);
//if apiTime is less than minTime, then we wait till minTime
long time = minTime - (System.currentTimeMillis() - start);
if (time > 0) {
Thread.sleep(time);
}
moveToNextScreen();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();

hardMoveToNextScreen();
}

private void moveToNextScreen() {
Intent i = new Intent(SplashActivity.this, MainActivity.class);
startActivity(i);
finish();
}

private void hardMoveToNextScreen () {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
moveToNextScreen();
}
}, maxTime);
}

}

现在,根据我使用的时间值,线程 t1调用方法 moveToNextScreen(),然后方法 hardMoveToNextScreen()调用相同的方法。因此,一旦 Activity 完成,我应该转到 MainActivity

我面临的问题是 MainActivity打开两次。一次从线程,然后从 hardMoveToNextScreen()方法。但是,这不应该发生,因为我已经在调用 finish(),这意味着一旦我移至 MainActivity,就不应再调用 SplashActivity中的任何方法。

我究竟做错了什么?

最佳答案

因此,首先,我将告诉您发生这种情况的原因,然后,我将继续介绍该问题的解决方案。

原因:

即使在调用onDestroy()方法之后, Activity 实例仍保留在内存中。现在,这并不意味着 Activity 实例将永远存在。它会根据系统的内存需求被Android OS销毁。
这个答案对此有很好的描述-
What is Activity.finish() method doing exactly?
而在这一点上-
Activity instance remains in the memory after onDestroy()
(此外,在StackOverflow上有许多答案描述了完全相同的内容。只需搜索一下即可)。

解决方案:

使用isDestroyed()方法返回一个 bool 值,以检查是否调用了 Activity 的onDestroy()方法。您可以在这里找到其文档-https://developer.android.com/reference/android/app/Activity.html#isDestroyed%28%29

所以moveToNextScreen()方法现在应该看起来像这样-

private void moveToNextScreen() {
if (!isDestroyed()) {
Intent i = new Intent(SplashActivity.this, MainActivity.class);
startActivity(i);
finish();
}
}

关于android - Activity 线程结束后, Activity 没有停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62154611/

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