Воспроизведение аудио файла и обновление интерфейса Android - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над приложением будильника, которое воспроизводит звук при каждом включении будильника.Почти все работает, но когда воспроизводится звук, пользовательский интерфейс перестает обновляться.

Я воспроизводю звук на 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...