При использовании Try Catch пропадает дизайн страницы

Задача: Каждое определенное время у меня появляется возможность тыкнуть кнопку в ритм музыке, за что получить награду. Для высчитывания "удачного" момента нажатия я использую sleep как delay, однако Android Studio просит обернуть его в try catch, либо добавить в метод фразу throws InterruptedException. Если добавить try catch, то почему-то пропадает дизайн всей страницы активной. Если же добавить фразу, то тогда место вызова метода нужно обернуть в try catch и появляется та же проблема. Метод, в котором это происходит - timeTiClick.

package com.example.clicker;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
//import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    MediaPlayer themeSong;
    MediaPlayer clickSong;

    static public int countScore = 0;                       // Общий счет очков
    static public int plusScore = 1;                        // Количество очков за один клик
    static public TextView textScore;                       // Отображение очков на главном экране

    private boolean canClickInTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textScore = (TextView)findViewById(R.id.score);

        themeSong = MediaPlayer.create(this, R.raw.theme_standart);
        clickSong = MediaPlayer.create(this, R.raw.click_standart);

        themeSong.setLooping(true);
        playSound(themeSong);

        try {                                               // Здесь я пытаюсь вызвать метод
            timeToClick();                                  // для подсчета времени клика
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    public void clickMe(View view) {                        // Логика нажатия на кнопку Click Me
        playSound(clickSong);

        if (canClickInTime){
            countScore += plusScore * 2;
        } else countScore += plusScore;

        updateScore();
    }


    public void shop(View view) {                           // Переход в магазин
        Intent intent = new Intent(MainActivity.this, Improve.class);
        startActivity(intent);
    }

    private void playSound(MediaPlayer sound) {
        if(sound.isPlaying()) {
            sound.pause();
            sound.seekTo(0);
        }
        sound.start();
    }

    private void updateScore(){
        textScore.setText(countScore + "");
    }

    private void timeToClick() throws InterruptedException {

        //if(clickSong.isPlaying()) {
        //    clickSong.pause();
        //    clickSong.seekTo(0);
        //}
        //clickSong.start();

        canClickInTime = true;

        Thread.sleep(100);

        canClickInTime = false;

        Thread.sleep(243);

        timeToClick();
    }


    @Override
    protected void onPause() {
        themeSong.release();
        super.onPause();
    }
}

Так должно быть Так становится после добавления try catch


Ответы (1 шт):

Автор решения: ЮрийСПб

Вы сразу из onCreate MainActivity усыпляете основной (UI) поток приложения, в котором и происходит отрисовка экрана. Засим у вас и не рисуется ничего.

Вам надо другим способом совершать отложенные действия, не усыпляя главный поток. Попробуйте, например, Timer + TimerTask, примерно так: https://stackoverflow.com/a/40798737/3212712

→ Ссылка