Почему пишет «приложение AppName остановлено»?

168
25 декабря 2018, 05:00

Захотелось сделать приложение, которое будет в 15:45 включать звук на телефоне, а в 8:45 отключать звук. Захотелось реализовать через AsyncTask. Запуск приложения -> выводит время -> 5 секунд проходит -> вылетает. Почему?

MainActivity.java

package com.pepelac.test_sound_change;
import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        assert am != null;
        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        am.setRingerMode(AudioManager.RINGER_MODE_SILENT); /* mute */
        MyTask longTask;
        longTask = new MyTask();
        longTask.execute();
    }
    @SuppressLint("StaticFieldLeak")
    class MyTask extends AsyncTask<Void, Void, Void> {
        @SuppressLint("ShowToast")
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast toast = Toast.makeText(getApplicationContext(),
                    "ok!", Toast.LENGTH_SHORT);
            toast.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            while (true) {
                task();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            //а здесь мы прячем диалог и заканчиваем работу всех функций которые были запущены в doInBackground()
        }
        public void task() {
            AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            Calendar calendar = Calendar.getInstance();
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int PM = calendar.get(Calendar.AM_PM);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            TextView textView = (TextView) findViewById(R.id.textView);
            textView.setText(String.valueOf(hour) +':'+String.valueOf(minute));
            if (hour == 8 && minute == 45 && PM == 0)
                am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
            if (PM == 1) {
                switch (dayOfWeek) {
                    case 2:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 3:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 4:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 5:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 6:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 7:
                        if ((hour == 1) && (minute == 0))
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                }
            }
        }
    }
}
Answer 1

чтобы сделать такое приложение используйте не AsyncTask, а AlarmManager. У вас приложение в это время может быть закрыто. Если закрыть приложение и вычистить его из памяти, то все что вы написали работать не будет. Вам надо посмотреть на примеры реализации будильника, но только вместо уведомления, менять режим звука

READ ALSO
Как обнулить цифры идущие после запятой?

Как обнулить цифры идущие после запятой?

Предположим у нас результатом деления оказалось число типа 2777777777

336
Обновление файлов css/js

Обновление файлов css/js

Есть молодой сайт, на котором приходится постоянно обновлять файлыИспользуется фреймворк Flask

235
Grid, обтекание блоков

Grid, обтекание блоков

Построена сетка из двух колонок, но с разной высотой, к примеру товары в две колонкиПодскажите, как сделать с помощью свойства display: grid, чтобы...

190