При использовании 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();
}
}
Ответы (1 шт):
Вы сразу из onCreate MainActivity усыпляете основной (UI) поток приложения, в котором и происходит отрисовка экрана. Засим у вас и не рисуется ничего.
Вам надо другим способом совершать отложенные действия, не усыпляя главный поток. Попробуйте, например, Timer + TimerTask, примерно так: https://stackoverflow.com/a/40798737/3212712

