2015-09-03 6 views
0

Я делаю программу для записи и воспроизведения звука. Это работает хорошо. Однако проблема заключается в том, что программа сработала, когда я нажимаю кнопку (справа внизу). Посмотрите мой чистый код и, пожалуйста, помогите мне исправить это. Заранее спасибоCrash when Kill/Close thread in android

private void cleanUp() 
    { 
    if (track != null) 
    { 
     mVisualizerView.release(); 
     track.release(); 
     track = null; 
    } 
    if (mWakeLock.isHeld()) { 
     mWakeLock.release(); 
    } 
    if(mIsRecording) 
    {  
    mRecorder.stop(); 
    try { 
     //Write file audio 
    } catch (IOException e) { 

    } 
    /////////////////Stop audio service 
    _audioManager.stopBluetoothSco(); 
    } 
    mRecorder.release(); 
    } 

@Override 
public void onDestroy() { 
    cleanUp(); 
    super.onDestroy(); 
} 

@Override 
protected void onPause() 
{ 
    cleanUp();  
    super.onPause(); 
} 

В которой эти переменные построены/используются как ниже код

private boolean mIsRecording = false; 
AudioTrack track =null; 
private AudioManager _audioManager; 
private VisualizerView mVisualizerView; 
protected PowerManager.WakeLock mWakeLock; 
private AudioRecord mRecorder; 

// Prevent phone from sleeping 
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag"); 
this.mWakeLock.acquire(); 
//Record audio 
private void startBufferedWrite(final File file) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      DataOutputStream output = null; 
      try { 
        output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); 
        ///////////Play during recording 
        track.play();     
        mVisualizerView = (VisualizerView) findViewById(R.id.visualizerView); 
        mVisualizerView.link(track); 
        while (mIsRecording) { 
        //Write to track 
        } 
       } 
     } 
    }).start(); 
} 

Ошибка в том, что

FATAL EXCEPTION: Thread-35897 
at java.lang.Thread.run(Thread.java:856) 
+0

Что вы хотите сделать с помощью интерфейса (VisualizerView) в потоке. –

+0

VisualizerView - это один класс для отображения визуализации музыки. Код является ссылкой из https://github.com/felixpalmer/android-visualizer – Jame

+0

, но как вы можете получить доступ к пользовательскому интерфейсу из фонового потока? –

ответ

1

вы пытаетесь использовать элементы пользовательского интерфейса в не- UI thread.Это причина сбоя.

вы можете попробовать что-то вроде этого.

new Thread() { 
     public void run() { 
      DataOutputStream output = null; 
     try { 
       output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); 
       ///////////Play during recording 
       track.play(); 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
         mVisualizerView =(VisualizerView) findViewById(R.id.visualizerView); 
        mVisualizerView.link(track); 
        while (mIsRecording) { 
         //Write to track 
         } 
         } 
        }); 

     } 
    }.start();