我遇到了问题,我做了一个简单的应用程序来向您展示我的问题。 我希望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的东西?
非常感谢!
答案 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);
}