活动布局显示得太晚了

时间:2014-05-25 14:33:11

标签: android layout android-activity

package com.example.myapp;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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


    @Override
    public void onResume() {   
        super.onResume();
        sleepForaWhile();
    }

    protected void sleepForaWhile()
    {
        try
        {
            Thread.sleep(10000);

        } catch (InterruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

当此活动开始时,我看到黑屏(不是活动布局)。然后,布局在10秒后显示,但我希望布局在睡眠代码之前可见。

如何创建此行为?

我试图将睡眠代码放在onStart()函数中,但没有任何改变。

2 个答案:

答案 0 :(得分:2)

你有

Thread.sleep(10000);

阻止ui线程。永远不要阻止ui线程。请删除sleep()

我不知道为什么你需要延迟。您可以延迟使用Handler。同样onCreate然后onResume

答案 1 :(得分:1)

假设这只是一个示例,(我假设您使用Thread.sleep()来表示任意长时间运行的任务)您需要移动Thread.sleep()关闭UI的方法。

在UI线程上的所有内容完成之前,UI不会返回视图。相反,我们可以使用AsyncTask

public class DoSomethingTask extends AsyncTask<Void,Void,Void> {

    private OnCompletionListener listener;

    // Pass the interface using this method
    public setOnCompletionListener(OnCompletionListener listener){
        this.listener = listener;
    }

    protected Void doInBackground(Void... params) {
       Thread.sleep(10000);
    }

    protected void onPostExecute(Void result) {
        // This will be called after the doInBackground method.
        // This method is called on the UI thread.

        // If an instance has been passed, you can access the 
        // onComplete method
        if (listener != null) {
            listener.onComplete();
        }
    }   

    // Create an interface
    public interface OnCompletionListener {
        void onComplete();
    }   
}

您可以通过以下方式从活动中调用此内容:

DoSomethingTask task = new DoSomethingTask();

task.setOnCompletionListener(new OnCompletionListener() {
    // put the activity methods in here
});

task.execute();`

这意味着将显示布局,然后在后台运行AsyncTask,执行您需要执行的任何操作。如果您愿意,可以从onPostExecute方法更新布局。