Android-студия, инициировать задачу между таймером расписания (JAVA) - PullRequest
0 голосов
/ 11 июля 2019

Я попытался создать код, который записывает файл WAV каждые 30 секунд, используя таймер.

        t.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            launchTask();
                        }
                    });
                }
            }, 0, 30000);

"задача запуска ()" начинает запись файла wav.

Проблема в том, что каждые 30 секунд он пытается запустить задачу снова, пока она еще выполняется.

Таким образом, перед выполнением задачи каждые 30 секунд ее необходимо отменить прямо перед этим.

Код:

   recordTask.cancel(false);

отменит задание, но я не уверен, что его нужно вызывать в коде таймера.

Любой совет о том, как этого добиться,быть очень ценным.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

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

Я бы предложил переместить ваш метод "launchTask" в собственный класс, реализовать интерфейс Runnable и рассматривать его как поток. Таким образом, вы можете запускать и останавливать его по мере необходимости, а также создавать (несколько) его экземпляров.

http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html

В этот момент вы можете передать свой «тайм-аут» классу и, возможно, остановиться самостоятельно. Это пример класса, который останавливает себя по ссылке выше. Вы должны иметь возможность включить конструктор с параметром, который позволит вам установить время ожидания. Вы также можете включить любой код для сохранения записи в методе «doStop». Таким образом, вы можете сделать класс полностью охватывающим весь код / ​​методы, необходимые для этой функции, чистым способом ООП.

public class MyRunnable implements Runnable {
    private boolean doStop = false;

    public synchronized void doStop() {
        this.doStop = true;
    }

    private synchronized boolean keepRunning() {
        return this.doStop == false;
    }

    @Override
    public void run() {
        while(keepRunning()) {
            // keep doing what this thread should do.
            System.out.println("Running");

            try {
                Thread.sleep(3L * 1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

Если вам нужно управлять потоком из текущего местоположения, вы можете сделать это (также со связанной страницы):

public static void main(String[] args) {
    MyRunnable myRunnable = new MyRunnable();

    Thread thread = new Thread(myRunnable);

    thread.start();

    try {
        Thread.sleep(10L * 1000L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    myRunnable.doStop();
}

Edit:
Я только что вспомнил, что Google сейчас запрещает тайное использование микрофона и камеры на устройствах. Если видео не отображается, вы не сможете использовать камеру и аналогичные функции для микрофона. Я не выступаю против вашего использования, так как я не знаю, что это такое, я просто говорю, чтобы быть осторожным, для чего вы его используете, и знать, что могут быть случаи, когда Google делает ошибки при фильтрации / поиск вещей, которые он не позволяет.

https://www.theverge.com/2018/3/7/17091104/android-p-prevents-apps-using-mic-camera-idle-background

0 голосов
/ 11 июля 2019

Я предлагаю использовать AsyncTask и выполнить запись 30-х годов в doInBackground.

Например (некоторый псевдокод):

class RecordingTask extends AysncTask<Void, Void, WavObject> {

  protected WavObject doInBackground() {
     while (recordTime <= 30s) {
        // keep recording
     }
     return wav;
  }

  protected void onPostExecte() {
     // Handle with your wav here
  } 
}

А в твоей деятельности:

t.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            new RecordingTask().execute();
                        }
                    });
                }
            }, 0, 30000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...