1

TextView を作成しました。public TextView textView;これは、後で MainActivity.java で次のように定義しますonCreate

    textView = (TextView) findViewById(R.id.textViewName);

ただし、テキストを設定すると、正しく更新されません。メソッドを使用するたびにsetText、画面が更新されません。への最初の呼び出しsetTextは、 というメソッド内にありrecordClap()ます。

    /**set text view*/
    textView.setText("listening...");

このテキストは画面に更新されません。

最後に、「Success!」を表示するテキストを設定します。一定の条件を満たしたとき。

    textView.setText("Success!");

何らかの理由で、これが機能する「setText」への唯一の呼び出しです。

では、TextView が新しいテキストを適切に更新しないのはなぜですか? 私が取り残したものはありますか?

以下の完全なコード:

public class MainActivity extends Activity{

private static final String TAG = "Clapper";
private static final long DEFAULT_CLIP_TIME = 1000;
private long clipTime = DEFAULT_CLIP_TIME;

/**create text view*/
public TextView textView;
private boolean continueRecording;
public static final int AMPLITUDE_DIFF_LOW = 10000;
public static final int AMPLITUDE_DIFF_MED = 18000;
public static final int AMPLITUDE_DIFF_HIGH = 32767; 
private int amplitudeThreshold=AMPLITUDE_DIFF_HIGH;
private MediaRecorder recorder = null;
private static String tmpAudioFile = null;

public boolean recordClap()
{
/**set text view*/
textView.setText("listening...");

Log.i(TAG, "record clap");
boolean clapDetected = false;

try
{

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

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile(tmpAudioFile);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.prepare();

    Log.i(TAG, "i've been prepared!");
}
catch (IOException io)
{
    Log.e(TAG, "failed to prepare recorder ", io);
}

recorder.start();
int startAmplitude = recorder.getMaxAmplitude();
Log.i(TAG, "starting amplitude: " + startAmplitude);

do
{
    Log.i(TAG, "waiting while recording...");
    waitSome();
    int finishAmplitude = recorder.getMaxAmplitude();
    int ampDifference = finishAmplitude - startAmplitude;
    if (ampDifference >= amplitudeThreshold)
    {
        Log.w(TAG, "heard a clap!");
        /**here is the output to screen*/
        /**reset text view*/
        textView.setText("Success!");

        clapDetected = true;
    }
    Log.d(TAG, "finishing amplitude: " + finishAmplitude + " diff: "
            + ampDifference);
} while (continueRecording || !clapDetected);

Log.i(TAG, "stopped recording");
done();

return clapDetected;
}

private void waitSome()
{
try
{
    // wait a while
    Thread.sleep(clipTime);
} catch (InterruptedException e)
{
    Log.i(TAG, "interrupted");
}
}

public void done()
{
Log.d(TAG, "stop recording");
if (recorder != null)
{
    if (isRecording())
    {
        stopRecording();
    }
        //now stop the media player
        recorder.stop();
        recorder.release();
    }
}

public boolean isRecording()
{
    return continueRecording;
}

public void stopRecording()
{
    continueRecording = false;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i("hello", "world!");
    setContentView(R.layout.activity_main);

    /**define text view*/
    textView = (TextView) findViewById(R.id.textViewName);

    /**run*/
    recordClap();

/**Restart Button*/    
final Button button = (Button) findViewById(R.id.button_id);
    button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Perform action on click
        recordClap();
    }
  });
}
} 
4

2 に答える 2

1

コメントで述べたように、変化はあまりにも速く起こっているので、あなたはそれを見ていません。速度を落とすか、waitSome を増やしてみてください。ただし、注意してください-waitSome()メソッドで正しく覚えていれば、UIスレッドでThread.sleepingしているため、この間UIが更新されません。したがって、次のようになっている可能性があります (UI スレッドのキューイングがどのように機能するか正確には思い出せません)。

  1. recordClap が呼び出されます
  2. textView.setText("listening") が呼び出され、キューに入れられます (ただし、UI はまだ更新されていません)
  3. Thread.sleep(1000) は UI スレッドを一時停止します
  4. TextView は、一瞬「聞いている」と言ってから次に進みます
于 2013-06-25T21:47:10.340 に答える