Matthias Vanb
Matthias Vanb

Reputation: 943

Lag on my buttons

I made a code which allow me to record the audio from the microphone. Strange thing is that when I click my button it appears to have some kind of lag, the button remains visually pressed for half a second and then starts it method. is there a reason for this, and how could I solve this?

What I am having right now:

private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }

private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }
public void onClick(View v) {

        switch (v.getId()) {
case R.id.bRecord:

            if (mStartRecording) {
                mRecordButton.setText("Stop Recording");
                onRecord(true);
                mStartRecording = false;

            } else {
                mRecordButton.setText("Start Recording");
                mStartRecording = true;
                onRecord(false);

            }

            break;
}

EDIT Thanks for the help, I decided to work with a service but am struggling a little bit. I created:

public class RecordService extends IntentService {

    private MediaRecorder mRecorder = null;
    private String mFileName;
    private static final String LOG_TAG = "RecordService";

    public RecordService() {
        super("RecordService");
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";

        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();

    }
}

and

case R.id.bRecord:

            if (mStartRecording) {
                mRecordButton.setText("Stop Recording");
                //onRecord(true);
                Intent service = new Intent(myContext, RecordService.class);
                myContext.startService(service); 
                mStartRecording = false;

            } else {
                mRecordButton.setText("Start Recording");
                mStartRecording = true;
                onRecord(false);

            }

            break;

Having a question about this, how can I now stop this service (= stop recording) (by clicking f.e. the button again) and communicate an idea back to the activity? I tried to add a stop function in the service but it is not seem to work when I call service.stop() to stop it..

Upvotes: 0

Views: 1042

Answers (2)

faceman
faceman

Reputation: 1328

  • You could use AsyncTask for short Operations (a few seconds at the most.)
  • Use Service for long running Operations

Attention: AsyncTask takes care of the thread handling for you. If you write a Service, you have to spawn your own thread otherwise it will run on the UI thread.

One of several ways to do it:

Service:

@Override       
protected void onHandleIntent(Intent intent) {

    //your recorder code

    //get the messenger from intent
    Bundle extras = intent.getExtras();
    if (extras != null) {
       Messenger messenger = (Messenger) extras.get("MESSENGER");
       try {
          //send a message back to the activity
          messenger.send(...);
       } catch (android.os.RemoteException e1) {
          Log.w(getClass().getName(), "Exception sending message", e1);
       }
    }
}

Activity:

Definition of the handler

private Handler handler = new Handler() {
    public void handleMessage(Message message) {
      //do something with the message from the service 
    };
};

The code to start the service

Intent intent = new Intent(this, YourService.class);
Messenger messenger = new Messenger(handler);
intent.putExtra("MESSENGER", messenger);
startService(intent);

Upvotes: 1

Anand
Anand

Reputation: 7764

My guess is that since you're starting the recording in the same thread as the UI, the UI doesn't respond until all the code in startRecording() has finished executing. You might want to consider calling onRecord in its own thread.

Upvotes: 3

Related Questions