SetContentView не работает, пока я использую обработчик - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь заставить приложение спать, используя 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 голосов
/ 01 октября 2019

Чтобы отобразить задержку, метод действия onCreate() должен выполняться полностью. В вашем втором коде есть нить. Этот поток останавливает компиляцию кода на 5000 миллисекунд. Это означает, что ваш второй код останавливается и ждет 5 секунд в строке wait(5000);. Поэтому onCreate() метод не завершен.

Вы использовали Handler().postDelayed() свой первый код. Этот метод не застрял в коде. Это фоновая задача. работает синхронно.

Надеюсь, ваш ответ здесь.

0 голосов
/ 01 октября 2019

Чтобы начать новый поток, используйте Thread#start(), а не Thread#run().

run() просто выполняет Runnable синхронно, т.е. блокирует текущий поток.

0 голосов
/ 01 октября 2019

используйте

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