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

问题描述 投票:0回答:2

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

怎么了?

java android multithreading handler runnable
2个回答
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);

0
投票

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

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

我希望你的答案在这里。


0
投票

要启动新线程,请使用Thread#start(),而不要使用Thread#run()

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

© www.soinside.com 2019 - 2024. All rights reserved.