【发布时间】:2020-06-02 14:40:36
【问题描述】:
我有一个正在运行动画的启动画面。以下是我关于从 启动画面 移动到 MainActivity 的逻辑。
启动画面的最短可见时间 = minTime
闪屏的最长可见时间 = maxTime
调用 API 并在一段时间内获得响应 - apiTime
1.至少为minTime显示启动画面。
2. 致电API。如果在不到maxtime 内收到 API 的响应,
立即移动到下一个屏幕,否则,移动到下一个屏幕
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() 调用相同的方法。所以,一旦活动结束,我应该转移到MainActivity。
我面临的问题是MainActivity 正在打开两次。一次来自线程,然后来自hardMoveToNextScreen() 方法。但是,这不应该发生,因为我已经在调用 finish(),这意味着一旦我移至 MainActivity,就不应再调用来自 SplashActivity 的任何方法。
我做错了什么?
【问题讨论】:
-
你能用 if(!isFinishing) 来调节你的方法吗?这可能会确保其中任何一个方法都不会执行。
标签: android multithreading android-intent splash-screen