在执行以下代码时,我发现整个应用程序冻结了10000ms,然后在模拟器的屏幕上显示任何内容。我本来希望第一个Toast消息出现,然后该应用程序冻结10000ms,第二个Toast消息出现。让我想知道android在执行它之前是否在“ oncreate”方法中堆积了所有代码。应该是那样吗?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Toast.makeText(this, new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
}
最佳答案
它的行为符合预期。有一个线程负责UI更新。它称为主线程。此线程也显示吐司消息。当您调用Toast.show()
时,Android会为主线程安排新任务。使用onCreate()
完成主线程后,它将执行此任务并显示吐司。但是因为您将主线程阻塞了10秒钟,所以没有显示吐司。没有人可以显示此消息。但是随后,在10秒后,这两个祝酒将一个接一个地出现,因为主线程可以自由显示它们。
最佳实践是永远不要阻塞主线程。否则,您的应用程序将冻结,并且用户将看到ANR(应用程序或响应)消息。如果需要稍后执行某些操作,则需要将此任务发布到主线程的任务队列中,以便稍后执行。
下面的代码将按您预期的方式运行。
public class MainActivity extends Activity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// show first toast immediately
Toast.makeText(this, new ServiceCode("Hi").s, Toast.LENGTH_SHORT).show();
// schedule second toast to appear 10 sec later
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
new ServiceCode("Hello").s, Toast.LENGTH_SHORT).show();
}
}, 10000);
}
}