在执行以下代码时,我发现整个应用程序冻结了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);

    }
}

10-07 19:15
查看更多