обновление уровня звука останавливает мое приложение (я использую handler.post) - PullRequest
0 голосов
/ 06 февраля 2019

Сначала небольшое вступление.Мне нужно сделать приложение, которое записывает звук с высокой точностью.Требования в том, чтобы я сделал приложение, которое записывает со скоростью 10 или более выборок в миллисекунду.

Редактировать: инициализация обработчика.

public class MyApp extends AppCompatActivity {
    <Initialize everything>
    Handler handler= new Handler();
}

У меня есть кнопка запуска, которая должна сделать несколько вещей, и в конце она должна измерить мой уровень звука.

buttonStart.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) 
    {    
        <intitializing sound stuff>

        handler.post(updateSoundLevel);
    }
});

Это переходит к следующему циклу.

@Override
protected void onCreate(Bundle savedInstanceState) {
    <Initialize buttons and some variables>
    final Runnable updateSoundLevel = new Runnable() {
        @Override
        public void run() {
            if (SoundRecording==true)
            {
                handler.post(this);
                    <here is measure the time and amplitude>   
            }
        }
    };
};

Проблема в том, что я не могу нажать кнопку «Стоп-запись» во время работы.изменение этого значения на handler.postdelayed(updateSoundLevel, 1) не является опцией, поскольку это замедляет все на 1 мс, что означает, что я не могу получить 10 выборок за мс.

Если я использую handler.postdelayed(this,1), я действительно могу заставить программу работать,И я могу остановить запись.

buttonStop.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View view)
    {
        //Stop mediarecorder
        try 
        {
            mediaRecorder.setOnErrorListener(null);
            mediaRecorder.setOnInfoListener(null);
            mediaRecorder.setPreviewDisplay(null);
            mediaRecorder.stop();
            mediaRecorder.release();
        }
        catch (IllegalStateException e)
        { <error message> }
        catch (RuntimeException e)
        { <error message> }
        catch (Exception e)
        { <error message> }
    <Code to draw a graph, ...>
    }
});
...