0

質問に記載されているように、startService で使用する前に、同じ Intent オブジェクトを再利用し、別のエクストラ データで再読み込みしています。これでよろしいですか?または、すべてのstartServiceの前に「新しいインテント(コンテキスト、サービスクラス)」を実行する必要がありますか?

処理の連続ストリームにサービスを使用しているため、データをサービスに送信する必要があるたびに新しいインテントを作成する必要があるかどうか少し心配です。

問題は、現在、サービスが 1 回しか実行されないように見えることです。後続のすべての startService 呼び出しは、サービスを起動していないようです。その理由は何ですか?

編集: コードの追加

主な活動は次のとおりです。

public class Measurement extends Activity{

    AudioRecord recorder;   
    int iAudioBufferSize;
    boolean bRecording; 
    int iBytesRead;


    // UI stuff 
    Button bt_Measure;
    Button bt_Stop; 
    RadioButton rd_Live;
    RadioButton rd_DataCollection;
    RadioButton rd_SampleCollection;
    Thread recordThread;
    Intent sampleDataIntent;


    @Override
    public void onDestroy() {       
    super.onDestroy();
    if (recorder != null)
        recorder.release();     
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bt_Measure = (Button) findViewById(R.id.bt_measure);
    bt_Measure.setEnabled(true);
    bt_Stop = (Button) findViewById(R.id.bt_stop);
    rd_Live = (RadioButton) findViewById(R.id.rd_live);
    rd_DataCollection = (RadioButton) findViewById(R.id.rd_datacollection);
    rd_SampleCollection = (RadioButton) findViewById(R.id.rd_samplecollection);
    rd_Live.setChecked(true);

    bRecording = false;
    int iSampleRate = AudioTrack
            .getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
    iAudioBufferSize = AudioRecord.getMinBufferSize(iSampleRate,
            AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
    recorder = new AudioRecord(AudioSource.MIC, iSampleRate,
            AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
            iAudioBufferSize);
    sampleDataIntent = new Intent(this, DetectionService.class);


    bt_Measure.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (rd_Live.isChecked()){ // radio button for Live processing
                if (!bRecording) {                  
                    bt_Measure.setEnabled(false);
                    bt_Stop.setEnabled(true);
                    try {
                        recorder.startRecording();
                        bRecording = true;

                        recordThread = new Thread() {
                            @Override
                            public void run() {
                                byte[] buffer = new byte[iAudioBufferSize];                                 
                                int iBufferReadResult;
                                int iBytesToRead = iAudioBufferSize;
                                iBytesRead = 0;
                                while (!interrupted()) {
                                    iBufferReadResult = recorder.read(buffer,
                                            0, iBytesToRead);                                                                                   
                                    sampleDataIntent.removeExtra("THE_DATA");
                                    sampleDataIntent.putExtra("THE_DATA", buffer);
                                    sampleDataIntent.putExtra("FRAME_SIZE", iBufferReadResult);
                                    startService(sampleDataIntent);                                                                                 
                                    iBytesRead = iBytesRead + iBufferReadResult;
                                }
                            }
                        };
                        recordThread.start();
                    } catch (Exception e) {
                        tv_Speed.setText(e.getLocalizedMessage());
                    }
                }
            }
        }
    });
    }
}

これは検出サービスです。

public class DetectionService extends IntentService {


ByteArrayOutputStream baos;
byte[] sampleBuffer;
byte[] lastSampleBuffer;
PeakFilter peakFilter1;
PeakFilter peakFilter2;
PeakFilter peakFilter3;
PeakFilter peakFilter4;

float fSum = 0;
short sAvgAmpl = 0;
short sMaxAvg = 0;
short sPeakAmpl = 0;


public DetectionService() {
    super("DetectionService");
    baos = new ByteArrayOutputStream();
    peakFilter1 = new PeakFilter(260, 20, 44100);
    peakFilter2 = new PeakFilter(260, 20, 44100);
    peakFilter3 = new PeakFilter(260, 20, 44100);
    peakFilter4 = new PeakFilter(260, 20, 44100);
}


@Override
protected void onHandleIntent(Intent sampleDataIntent) {
    try {
        baos.write(sampleDataIntent.getByteArrayExtra("THE_DATA"));
    } catch (IOException e1) {          
        e1.printStackTrace();
    }
    if (baos.size() > 44100 * 5) // 5 second frame
        sampleBuffer = baos.toByteArray();
    else
        return;

    try {

            // NON THREAD IMPEMENTATION
            // Threaded implementation has the same Try..Catch executed in
            // separate thread. Neither seems to be running more than once.

        short[] preFilterBuffer = new short[sampleBuffer.length/2];
        int iSample = 0;

        for (int i = 0, j = 0; i < preFilterBuffer.length; i++, j+=2){                          
            preFilterBuffer[iSample] = (short) (sampleBuffer[j+1] << 8 | sampleBuffer[j]);
            iSample++;
        }

        short[] FilteredSamples = new short[preFilterBuffer.length];            
        // Filters are not spawning threads. Purely Math processing.
        peakFilter1.filter(FilteredSamples, preFilterBuffer, preFilterBuffer.length);
        peakFilter1.amplify(FilteredSamples, FilteredSamples, 3);
        peakFilter2.filter(FilteredSamples, FilteredSamples, FilteredSamples.length);
        peakFilter2.amplify(FilteredSamples, FilteredSamples, 3);
        peakFilter3.filter(FilteredSamples, FilteredSamples, FilteredSamples.length);
        peakFilter3.amplify(FilteredSamples, FilteredSamples, 2);
        peakFilter4.filter(FilteredSamples, FilteredSamples, FilteredSamples.length);

        // LOT OF MATH on filtered samples
        // ......
        // 
    } catch (Exception e) {         
        e.printStackTrace();            }


}
4

1 に答える 1

0

たとえば、サービスにメソッドを追加できますputData(...)...サービスを開始した後、サービスが...生きている場合は、オブジェクトとして使用するだけだと思います。

于 2012-07-28T15:35:19.007 に答える