SetContentView 在我使用处理程序时不起作用

SetContentView does not work while I'm using handler

我正在尝试使用 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);
}

但是这个有问题。当我以毫秒为单位设置时间让应用程序等待时,它会工作并且第二个 Activity 开始但 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();

怎么了?

使用

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);

为了显示布局,Activity 的 onCreate() 方法应该 运行 完整。在您的第二个代码中有一个线程。该线程会停止您的代码编译 5000 毫秒。这意味着您的第二个代码在 wait(5000); 行停止并等待 5 秒。因此 onCreate() 方法没有完成。

您已经使用了 Handler().postDelayed() 您的第一个代码。这种方法不会卡住代码。这是一个后台任务。它同步工作。

我希望你的答案在这里。

要开始新线程,请使用 Thread#start() 而不是 Thread#run()

run() 只是同步执行 Runnable 即阻塞当前线程。