setContentView执行太晚了

时间:2012-12-24 20:38:38

标签: android

我遇到了问题,我做了一个简单的应用程序来向您展示我的问题。 我希望setContentView执行并在执行Sleep之前显示.xml。我以为一切都会按顺序执行? 有没有人怎么能说我为什么不这样做?

public class MainActivity extends Activity {

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

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // do something
    }

非常感谢!

编辑:

这是真正的OnCreate,似乎是一个更大的问题。

睡眠的一切都运行良好,但使用Connect方法存在问题。

public void onCreate(Bundle savedInstanceState)     {
        super.onCreate(savedInstanceState);         的setContentView(R.layout.activity_main);

ConnectBluetooth();

}   

的 在ConnectBluetooth()方法中,我只是创建一个新的Socket并尝试连接。

使用ned线程或处理程序似乎不起作用,那我该怎么办?使用类似asynctask的东西?

非常感谢!

2 个答案:

答案 0 :(得分:2)

在调用onResume()之后,创建过程完成后才会显示布局。但是,在显示布局时没有回调,但您可以使用Handler和Runnable来执行此操作。


创建几个字段变量:

Handler handler = new Handler();
Runnable delay = new Runnable() {
    @Override
    public void run() {
        // Do something 
    }
};

onCreate()致电:

handler.postDelayed(delay, 10000);

答案 1 :(得分:1)

当您致电sleep时,您正在暂停UI线程。这将阻止onCreate返回,这将阻止框架完成您的活动的初始化,包括显示您的视图层次结构。

你永远不应该像那样暂停UI线程。如果您想在10秒后执行某些操作,则可以启动一个单独的线程,以便在正确的时间执行此操作:

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

    new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(10000);
                doSomething();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }.start();
}

更简洁的方法是使用Handler

Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mHandler = new Handler();
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            doSomething();
        }
    }, 10000);
}