Я работаю над приложением будильника, которое воспроизводит звук при каждом включении будильника.Почти все работает, но когда воспроизводится звук, пользовательский интерфейс перестает обновляться.
Я воспроизводю звук на IntentService.
MainActivity:
package thedutchmc.net.alarm;
import android.app.IntentService;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Looper;
import android.widget.EditText;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Switch;
import android.widget.TextView;
import android.os.*;
import android.content.Intent;
import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.time.LocalTime;
public class MainActivity extends AppCompatActivity {
public static String alarmTimeString;
public static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
public static boolean alarmBool = false;
public static boolean isRinging = false, isRinging1 = false, isRinging2 = false, isRinging3 = false;
public int hour, minute;
public int minute1, minute2, minute3;
public int intLTimeMinute1, intLTimeMinute2, intLTimeMinute3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView mTextView = (TextView) findViewById(R.id.currentTime);
mTextView.setText("Current Time: ");
MainActivity.scheduler.scheduleAtFixedRate(new TaskHandler(), 1, 1, TimeUnit.SECONDS);
}
public void onSubmit(View v){
System.out.println("Submit!");
EditText alarmTimeEditText = (EditText) findViewById(R.id.setAlarmTime);
alarmTimeString = alarmTimeEditText.getText().toString();
System.out.println("MainActivity (alarmTime): " + alarmTimeString);
alarmBool = true;
TextView confirm = (TextView) findViewById(R.id.confirm);
confirm.setText("Alarm set!");
checkSwitch();
}
public void startService(View view) {
startService(new Intent(getBaseContext(), Service.class));
}
public void checkSwitch() {
Switch enableInterval = (Switch) findViewById(R.id.intervalEnabled);
Boolean enableIntervalState = enableInterval.isChecked();
if(enableIntervalState) {
switchEnabled();
}
}
public void switchEnabled() {
System.out.println("switch on!");
convertToTime(MainActivity.alarmTimeString);
minute1 = minute + 5;
minute2 = minute + 10;
minute3 = minute + 15;
System.out.println("Minute1: " + minute1);
System.out.println("Minute2: " + minute2);
System.out.println("Minute3: " + minute3);
}
public void changeAlarmStatusTextView(String status) {
TextView statusText = (TextView) findViewById(R.id.alarmStatus);
statusText.setText(status);
}
public class TaskHandler implements Runnable {
final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
MainActivity act = new MainActivity();
@Override
public void run() {
TextViewTimeUpdater textViewTimeUpdater = new TextViewTimeUpdater();
textViewTimeUpdaterHandler.post(textViewTimeUpdater);
if (checkAlarmBool()) {
System.out.println("Main alarm!");
startService(new Intent(getBaseContext(), Service.class));
changeAlarmStatusTextView("Alarm Ringing!");
}
if (checkSecondAlarmBool()) {
System.out.println("Second alarm!");
startService(new Intent(getBaseContext(), Service.class));
changeAlarmStatusTextView("5 Minutes Alarm!");
}
if(checkThirdAlarmBool()) {
System.out.println("Third alarm!");
startService(new Intent(getBaseContext(), Service.class));
changeAlarmStatusTextView("10 Minutes Alarm!");
}
if(checkFourthAlarmBool()) {
System.out.println("Fourth Alarm!");
startService(new Intent(getBaseContext(), Service.class));
changeAlarmStatusTextView("15 Minutes Alarm!");
}
}
boolean checkAlarmBool() {
if (MainActivity.alarmBool && !isRinging) {
String lTime = LocalTime.now().format(dtf);
convertToTime(MainActivity.alarmTimeString);
if(lTime.equalsIgnoreCase(MainActivity.alarmTimeString)) {
isRinging = true;
return true;
} else {
return false;
}
} else {
return false;
}
}
boolean checkSecondAlarmBool() {
if(!isRinging1) {
final DateTimeFormatter dtfm = DateTimeFormatter.ofPattern("mm");
try {
String lTimeMinute = LocalTime.now().format(dtfm);
intLTimeMinute1 = Integer.parseInt(lTimeMinute);
System.out.println(intLTimeMinute1);
} catch (Exception e) {
e.printStackTrace();
}
if(minute1 == intLTimeMinute1) {
isRinging1 = true;
return true;
} else {
return false;
}
} else {
return false;
}
}
boolean checkThirdAlarmBool() {
if(!isRinging2) {
final DateTimeFormatter dtfm = DateTimeFormatter.ofPattern("mm");
try {
String lTimeMinute = LocalTime.now().format(dtfm);
intLTimeMinute2 = Integer.parseInt(lTimeMinute);
} catch (Exception e) {
e.printStackTrace();
}
if(minute2 == intLTimeMinute2) {
isRinging2 = true;
return true;
} else {
return false;
}
} else {
return false;
}
}
boolean checkFourthAlarmBool() {
if(!isRinging3) {
final DateTimeFormatter dtfm = DateTimeFormatter.ofPattern("mm");
try {
String lTimeMinute = LocalTime.now().format(dtfm);
intLTimeMinute3 = Integer.parseInt(lTimeMinute);
} catch (Exception e) {
e.printStackTrace();
}
if(minute3 == intLTimeMinute3) {
isRinging3 = true;
return true;
} else {
return false;
}
} else {
return false;
}
}
}
Handler textViewTimeUpdaterHandler = new Handler(Looper.getMainLooper());
public class TextViewTimeUpdater implements Runnable{
final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
@Override
public void run() {
TextView seeTime = (TextView) findViewById(R.id.currentTime);
seeTime.setText(LocalTime.now().format(dtf));
}
}
public void convertToTime(String text) {
DateFormat sdf = new SimpleDateFormat("hh:mm");
try {
Date date = sdf.parse(text);
System.out.println("Time: " + date);
hour = date.getHours();
minute = date.getMinutes();
} catch (Exception e) {
e.printStackTrace();
}
}
public void stopService(View view) {
stopService(new Intent(getBaseContext(), Service.class));
}
}
Служба:
package thedutchmc.net.alarm;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.os.HandlerThread;
import android.support.annotation.Nullable;
public class Service extends android.app.IntentService {
public Service() {
super("Audio-Service");
}
boolean songPlaying;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
protected void onHandleIntent(Intent intent) {
System.out.println("SERVICE RUNNING!");
if(!songPlaying) {
playSound();
}
}
/*@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO
System.out.println("SERVICE RUNNING!");
if(!songPlaying) {
playSound();
}
return START_STICKY;
}*/
@Override
public void onDestroy() {
super.onDestroy();
}
public void playSound() {
System.out.println("SOUND");
songPlaying = true;
final MediaPlayer mp = MediaPlayer.create(this, R.raw.alarm);
mp.start();
if(!mp.isPlaying()) {
System.out.println("Thread killed");
mp.release();
onDestroy();
}
}
}
Я читал, что если поместить его в другой поток или AsyncTask, это может исправить положение, я довольно новичок в Java, поэтому точно не знаю, как это сделать.Если кто-нибудь сможет мне помочь, я буду очень признателен!.
Android API 26 (Android 8.0.0)