更新声级会冻结我的应用程序(我正在使用handler.post)

时间:2019-02-06 10:49:29

标签: java android mediarecorder android-mediarecorder

首先是一个简短的介绍。我需要制作一个可以准确记录声音的应用程序。要求是我制作一个应用程序,该应用程序每毫秒记录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, ...>
    }
});

0 个答案:

没有答案