我试图创建代码,使用计时器每 30 秒记录一个 wav 文件。
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
launchTask();
}
});
}
}, 0, 30000);
“launch task()”开始录制wav文件。
问题是它每 30 秒尝试在任务仍在运行时再次启动它。
因此,在每 30 秒启动一次任务之前,需要先取消它。
代码:
recordTask.cancel(false);
将取消任务,但我不确定是否在计时器代码中调用它。
如有任何关于如何实现这一目标的建议,我们将不胜感激。
最佳答案
我看到的问题是这是您正在创建的匿名方法。它被设计为不易访问,因为您已将其创建为匿名方法。
我建议将您的“launchTask”方法移动到它自己的一个类中,实现 Runnable 接口(interface),并将其视为一个线程。这样您就可以根据需要启动和停止它,以及创建它的(多个)实例。
http://tutorials.jenkov.com/java-concurrency/creating-and-starting-threads.html
在这一点上,您可以将您的“超时”传递给类(class),并且可能已经停止了。这是一个从上面的链接停止自身的类的例子。您应该能够包含一个带有参数的构造函数,该参数可以让您设置超时。您还可以在“doStop”方法中包含任何代码以保存记录。这样,您可以使该类以干净的 OOP 方式完全包含此功能所需的所有代码/方法。
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();
}
编辑:
我只记得谷歌现在禁止在设备上 secret 使用麦克风和摄像头。如果视频未显示,您将无法使用摄像头,麦克风也是如此。我不是反对你使用它,因为我不知道它是什么,我只是说要小心你使用它的目的并且要知道谷歌在过滤时可能会犯错误/搜索不允许的内容。
https://www.theverge.com/2018/3/7/17091104/android-p-prevents-apps-using-mic-camera-idle-background
关于java - Android studio,在定时器调度之间启动任务(JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979540/