我设置了2个活动的简单应用程序。我在第一次活动中遇到了问题。它仅用于替换徽标3秒钟,然后启动第二个活动。问题是它没有加载布局,它等待3秒然后加载第二个活动。代码在这里:
public class StartActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_screen);
final Intent myAct = new Intent(this, MyActivity.class);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
startActivity(myAct);
finish();
}
}
我能够通过创建另一个线程并在那里执行等待来解决这个问题。固定代码在这里:
new Thread(){
public void run(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
startActivity(myAct);
finish();
}
}.start();
所以我实际上解决了这个问题。我只是想知道为什么它的工作方式是第二种方式,但它不能通过第一种方式工作,因为我不理解它。
答案 0 :(得分:4)
在第一种情况下,您告诉UI Thread
要睡觉,阻止它绘制布局。完成睡眠过程后,它会立即启动下一个Activity
。这就是为什么您没有看到显示第一个Activity
布局的原因。根本不推荐这种方法,因为在睡眠时间内,您的应用程序无法响应任何用户操作。建议您使用AsyncTask
或新Thread
或Handler
使用postDelayed()
方法,但不要让UIThread
停止执行其工作(绘图)和处理UI事件)。
在第二种情况下,您在新sleep()
而不是Thread
中制作UIThread
。所以,会发生的事情是UI Thread
永远不会中断,并且允许绘制整个布局。同时,睡眠时间也受到尊重。 sleep()
结束后,您的新Activity
即会开始。
答案 1 :(得分:1)
第一种方法使UI线程休眠。这导致停止活动的所有功能和UI交互。 第二种方法使用另一个线程。因为它是睡眠主UI线程的所有UI部分的另一个线程工作正常,代码按预期工作。
答案 2 :(得分:1)
实际上你的方法也是错误/不好的做法。 应在主线程上完成新活动和结束电流。 还要尽量避免最终对象初始化,它们可能会堆叠在内存中。 这是一种正确的方法(postDelayed()将在MainThread上执行):
公共类StartActivity扩展了Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_screen);
View view = findViewById(R.id.any_view_from_start_screen_layout);
view.postDelayed(new Runnable(){
public void run(){
startNewActivityAndCloseCurrent();
},3000);
}
private void startNewActivityAndCloseCurrent(){
Intent myAct = new Intent(this, MyActivity.class);
startActivity(myAct);
finish();
}
}