2013-03-05 2 views
0

Я сделал код, который позволяет записывать звук с микрофона. Странно то, что когда я нажмите на мою кнопку, похоже, что есть какой-то лаг, кнопка остается визуально нажатой в течение половины секунды, а затем запускает ее метод. есть ли причина для этого и как я могу это решить?Отложить на мои кнопки

То, что я имею сейчас:

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 Спасибо за помощь, я решил работать с сервисом, но борюсь немного. Я создал:

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(); 

    } 
} 

и

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; 

Имея вопрос об этом, как я теперь могу остановить эту службу (= остановить запись) (нажав Ф.Э. кнопку) и сообщить идею обратно активность? Я попытался добавить функцию остановки в службу, но она не работает, когда я вызываю service.stop(), чтобы остановить ее.

ответ

1
  • Вы можете использовать AsyncTask для коротких операций (несколько секунд на большинстве.)
  • Используйте Service для длительных операций

Внимание:AsyncTask заботится о резьбе для вас. Если вы пишете 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); 
     } 
    } 
} 

активность:

Определение обработчика

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

Код для STA rt Услуга

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

Спасибо, никогда не использовал это, но я быстро прочитаю его и попробую, вернусь, чтобы сообщить, разрешила ли я его! –

+2

@MatthiasVanb В документе [document] (http://developer.android.com/reference/android/os/AsyncTask.html) говорится: * AsyncTasks идеально подходит для коротких операций (всего несколько секунд) * Я думаю, вам нужно ['Сервис'] (http://developer.android.com/reference/android/app/Service.html). – 2013-03-05 08:18:25

+0

Мм, хорошо. Я новичок, так что теперь мне действительно трудно понять, какой из них лучше: D Но сама запись может быть, конечно, дольше нескольких секунд.это будет в большинстве случаев ... –

3

Я предполагаю, что, поскольку вы начинаете запись в том же потоке, что и пользовательский интерфейс, пользовательский интерфейс не отвечает до тех пор, пока не завершится выполнение всего кода в startRecording(). Возможно, вы захотите рассмотреть возможность вызова onRecord в своем потоке.

+0

Спасибо! Я прочитаю об AsyncTask и вернусь сюда! –

Смежные вопросы