【问题标题】:Crash when Kill/Close thread in android在android中杀死/关闭线程时崩溃
【发布时间】:2015-09-03 11:42:12
【问题描述】:

我正在制作一个程序来录制和播放音频。它运作良好。但是,问题是当我按下后退按钮(右下角)时程序崩溃。让我看看我的干净代码,请帮我修复它。提前致谢

  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)

【问题讨论】:

  • 你想在线程中使用 UI(VisualizerView) 做什么。
  • VisualizerView 是显示音乐可视化的一类。代码来自github.com/felixpalmer/android-visualizer
  • 但是如何从后台线程访问 UI??
  • 我认为这是崩溃的问题。
  • 看起来没问题..但是使用try catch块...我建议:)我正在发布我的答案..请接受它

标签: android multithreading audio-recording audiotrack


【解决方案1】:

您试图在非 UI 线程中使用 UI 元素。这是导致崩溃的原因。

你可以试试这样的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多