0

新しいスレッドを呼び出すときに、ここで少し問題があります。

私はオーディオ録音アプリを作成しており、別のスレッドで録音/再生を呼び出しています。

録音を開始するボタンがあります。handler.post オブジェクトとメソッドを使用して、ボタンを新しいテキストで更新しようとしています。

問題は、更新に時間がかかりすぎることです。スレッドが +5 秒長く実行されるまで、テキストは更新されません。

誰かが私を助けることができますか?お願いします?

  package com.EJH.Industries.microkr;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.media.MediaSyncEvent;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {
//CLASS VARIABLES
    //CHAR SEQUENCE
    CharSequence easyChar = "PLAYING";
    public Handler textViewHandler = new Handler();

    //CREATE THE RECORDING OBJECT
    int audioSrc = MediaRecorder.AudioSource.MIC;
    int sampleRate = 44100;
    int chanConfig = AudioFormat.CHANNEL_IN_MONO;
    int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    int getMinBuffSize = 200*AudioRecord.getMinBufferSize(sampleRate, chanConfig, audioFormat);
    int minBuffSize = (int) getMinBuffSize;
    short audioBuff[] = new short[minBuffSize];
    public AudioRecord micRecorder = new AudioRecord(audioSrc, 22050, chanConfig, audioFormat, minBuffSize);



    //CREATE THE PLAYBACK OBJECT
    int streamType = AudioManager.STREAM_MUSIC;
    int playMode = AudioTrack.MODE_STREAM;
    int playChanConfig = AudioFormat. CHANNEL_OUT_MONO;
    public AudioTrack speakerPlay = new AudioTrack(streamType, sampleRate, playChanConfig, audioFormat, 8192, playMode);



    public void startRec(){
        micRecorder.startRecording();
        micRecorder.read(audioBuff, 0, minBuffSize);
        micRecorder.stop();
        micRecorder.release();
    }

    public void startPlayback(){

        speakerPlay.play();
        speakerPlay.write(audioBuff, 0, minBuffSize);
        speakerPlay.stop();

    }









    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button startBtn = (Button) findViewById(R.id.startButton);
        startBtn.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub


                Thread recThread = new Thread( new Runnable(){

                    public void run() {
                        // TODO Auto-generated method stub


                        textViewHandler.post(new Runnable () {
                            public void run(){
                                startBtn.setText("Recording!");
                            }

                        });


                        startRec();
                    }

                });

                // RUN RECORDING FUNCTION
                recThread.run();
                try {
                    recThread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


                Thread playThread = new Thread( new Runnable(){

                    public void run() {
                        // TODO Auto-generated method stub

                        startPlayback();
                    }

                });





                playThread.run();
                try {
                    playThread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }

        });

    ///////END onCreate//////////    
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


}
4

1 に答える 1

0

最初に startRec() を呼び出してから recThread を実行しているためだと思います。以下のようにコードを変更してみてください。つまり、上記の recThread.run() 行から startRec() 関数を削除し、試した後に追加しますキャッチ..それがあなたを助けたことを願っています..

Thread recThread = new Thread( new Runnable(){

                    public void run() {
                        // TODO Auto-generated method stub


                        textViewHandler.post(new Runnable () {
                            public void run(){
                                startBtn.setText("Recording!");
                            }

                        });

                  //remove it from here..
                       // startRec();
                    }

                });

     // RUN RECORDING FUNCTION
                recThread.run();
                try {
                    recThread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    //add here..
                startRec();
于 2012-08-23T05:20:44.460 に答える