如何停止/启动包含创建无限循环的服务

use*_*581 5 service multithreading android loops infinite

因此,对于后台,我正在尝试创建一个通过麦克风连续记录并将数据存储在缓冲区中的应用程序.该程序的目标是对缓冲区中的数据执行某种类型的处理并对其进行操作.目前,应用程序只是将数据读入缓冲区并尽快写入.当运行应用程序时,人们会对着麦克风说话,然后听到你刚刚说出来的另一端.

现在,我对Android的经验不足以开始发挥作用.我正在进行读写操作,这是一个无限循环.服务如下:

public class AudioService extends Service {

private final int MIC = AudioSource.MIC;
private final int SAMPLE = 44100;
private final int CHANNELI = AudioFormat.CHANNEL_IN_MONO;
private final int CHANNELO = AudioFormat.CHANNEL_OUT_MONO;
private final int FORMAT = AudioFormat.ENCODING_PCM_16BIT;
private final int BUFFERSIZE = AudioRecord.getMinBufferSize(SAMPLE,
        CHANNELI, FORMAT);
private final int STREAM = AudioManager.STREAM_MUSIC;
private final int MODE = AudioTrack.MODE_STREAM;
private boolean play = true;

AudioRecord recorder = null;
AudioTrack track = null;

short[] buffer = null;

public void OnCreate() {

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    recorder = new AudioRecord(MIC, SAMPLE, CHANNELI, FORMAT, BUFFERSIZE);
    track = new AudioTrack(STREAM, SAMPLE, CHANNELO, FORMAT, BUFFERSIZE,
            MODE);
    buffer = new short[BUFFERSIZE];
    recorder.startRecording();
    track.play();

    while (play) {
        recorder.read(buffer, 0, buffer.length);
        track.write(buffer, 0, buffer.length);
    }
    return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)

在活动中单击"记录"按钮时,将调用此服务.我希望能够单击记录并选择单击取消以停止此循环.实现此目的的下面的监听器是:

private OnClickListener Recording = new OnClickListener() {
    public void onClick(View v) {

        serviceIntent = new Intent(getApplicationContext(),
                AudioService.class);
        serviceIntent.putExtra("extraData", "somedata");
        startService(serviceIntent);

        record.setEnabled(false);
        cancel.setEnabled(true);
        cancel.requestFocus();

};
Run Code Online (Sandbox Code Playgroud)

现在问题变得明显了.应用程序在到达startService(serviceIntent)时无法完成执行,只是在余额中挂起.

那么我的追索权是什么?我正在考虑从无限循环内部控制服务的一些方法,但我对Android的经验不足让我想知道如何做到这一点.通过在循环中实例化一个新按钮来煽动某种打破方式; 所以在startIntent期间,我将能够突破循环并"结束疯狂".

任何帮助,将不胜感激.我也意识到这个服务应该从UI的一个单独的线程开始,以避免"应用程序没有响应..."问题,但这是另一个主题.我现在的主要目标是打破循环,我将不胜感激任何有关如何做到这一点的帮助或方向.

Com*_*are 5

该服务在下面

问题1:您无法中断循环。

问题2:您的循环正在主应用程序线程上运行。

这不好。

那我有什么办法呢?

您将无限循环放在后台线程中,使用某种方法(例如AtomicBoolean)告诉该线程在需要时停止(例如onDestroy())。

我还意识到,应该在与UI分开的线程上启动此服务,以免出现“应用未响应...”问题,但这是另一个主题。

不,这是同一主题。

通过在循环内实例化一个新按钮来激发某种打破方式

服务没有UI。

由于该活动中有一个“记录”按钮可以触发对的调用startService(),因此该活动可能应该有一个“停止”按钮来触发对的调用stopService()

一旦确定了调用的位置和方式stopService(),那么您要做的就是获取onDestroy()服务,以使后台线程停止运行,这onDestroy()将由对的调用触发stopService()