使用处理程序时,SetContentView无法正常工作

时间:2019-10-01 18:51:39

标签: java android multithreading handler runnable

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

怎么了?

3 个答案:

答案 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,即阻塞当前线程。