我正在尝试使用Thread
使应用程序进入睡眠状态。我有2个解决方案,但是其中一个会引起问题。
这是一段较短的代码,可以很好地工作:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
final Handler goToMenu = new Handler();
goToMenu.postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(getApplicationContext(), Menu.class);
startActivity(i);
}
},5000);
}
但是这个有问题。当我花时间以毫秒为单位让应用等待时,它开始工作,并且第二个活动开始,但是R.layout.welcome
没有出现。该应用只是等待灰色背景,直到执行startActivity(i)
。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
final Handler goToMenu = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
Intent i = new Intent(getApplicationContext(), Menu.class);
startActivity(i);
}
};
Runnable run = new Runnable() {
@Override
public void run() {
try {
synchronized (this) {
wait(5000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d(TAG, "Waiting didnt work!!");
e.printStackTrace();
}
goToMenu.sendEmptyMessage(0);
}
};
Thread waitThread = new Thread(run);
waitThread.run();
怎么了?
答案 0 :(得分:0)
使用
Handler.postDelayed(new Runnable(){}, DELAY_TIME) instead
针对您的情况
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(getApplicationContext(), Menu.class);
startActivity(i);
}
}, 5000);
答案 1 :(得分:0)
要显示布局,Activity的onCreate()
方法应完全运行。在第二个代码中,有一个线程。该线程将使您的代码编译停止5000毫秒。这意味着您的第二个代码将停止,并在wait(5000);
行中等待5秒钟。因此onCreate()
方法无法完成。
您已使用Handler().postDelayed()
的第一个代码。此方法不会卡住代码。这是一项后台任务。它可以同步工作。
我希望你的答案在这里。
答案 2 :(得分:0)
要启动新线程,请使用Thread#start()
而不是Thread#run()
。
run()
只是同步执行Runnable
,即阻塞当前线程。