2

我有一个问题,我做了一个简单的应用程序来告诉你我的问题。我希望 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 线程或处理程序似乎不起作用,那我该怎么办?使用类似异步任务的东西?

非常感谢共同点!

4

2 回答 2

2

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


创建几个字段变量:

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

onCreate()调用:

handler.postDelayed(delay, 10000);
于 2012-12-24T20:41:57.397 回答
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);
}
于 2012-12-24T20:41:26.490 回答