活动不加载布局

时间:2014-09-13 21:24:23

标签: java android multithreading android-activity

我设置了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();

所以我实际上解决了这个问题。我只是想知道为什么它的工作方式是第二种方式,但它不能通过第一种方式工作,因为我不理解它。

3 个答案:

答案 0 :(得分:4)

在第一种情况下,您告诉UI Thread要睡觉,阻止它绘制布局。完成睡眠过程后,它会立即启动下一个Activity。这就是为什么您没有看到显示第一个Activity布局的原因。根本不推荐这种方法,因为在睡眠时间内,您的应用程序无法响应任何用户操作。建议您使用AsyncTask或新ThreadHandler使用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();
 }
}