0

ボタンを使ったアクティビティがあります。ACTION_DOWN で録音を開始し、このボタンを押している間、録音を続けます。ACTION_UP で、記録を停止する必要があります。録音スレッドは別スレッドです。アクティビティには、記録時間を示すテキスト ビューがあります。時間のデフォルト値は「00:00:00:000」です。記録スレッドから、アクティビティ クラスの updateTime メソッドを呼び出します。

public void updateTime(final String time) {
    Log.d("***UPDATE TIME Thread", "Current time:" + time);
    runOnUiThread(new Runnable() {
        public void run() {
            timerTextView.setText(time);
            Log.d("UPDATE TIME Thread", "Current time:"+time);
        }
    });
}

このアクティビティを初めて呼び出すと、正常に動作し、時間の値が適切に更新されます。しかし、前の画面で同じオプションを選択して 2 回目の記録を開始すると、時間テキスト ビューの値は「00:00:00:000」のままになり、2 番目の Log.d コード行では適切な値が表示されます。LogCat はこちら

02-25 16:07:10.660: D/Recording(5075):  Start
02-25 16:07:10.695: D/***UPDATE TIME Thread(5075): Current time:00:00:00:032
02-25 16:07:10.711: D/UPDATE TIME Thread(5075): Current time:00:00:00:032
02-25 16:07:10.843: D/***UPDATE TIME Thread(5075): Current time:00:00:00:174
02-25 16:07:10.863: D/UPDATE TIME Thread(5075): Current time:00:00:00:174
02-25 16:07:10.945: D/***UPDATE TIME Thread(5075): Current time:00:00:00:280
02-25 16:07:10.972: D/UPDATE TIME Thread(5075): Current time:00:00:00:280
02-25 16:07:11.082: D/***UPDATE TIME Thread(5075): Current time:00:00:00:418
02-25 16:07:11.089: D/UPDATE TIME Thread(5075): Current time:00:00:00:418
02-25 16:07:11.203: D/***UPDATE TIME Thread(5075): Current time:00:00:00:535
02-25 16:07:11.222: D/UPDATE TIME Thread(5075): Current time:00:00:00:535
02-25 16:07:11.351: D/***UPDATE TIME Thread(5075): Current time:00:00:00:676
......
Here is my Activity Class Code

public class VerficationPBActivity extends Activity implements VoiceManagerListener, OnTouchListener { private Claimant currentClaimant = null; TextView screenHeading = null; private String screenHeadingText = null; TextView textToSpeakTextView = null; TextView timerTextView = null; TextView statusHintTextView = null; プライベート ボタン pushToRecordButton;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_verfication_pb);
    ActivityController.getActivityController().setCurrentActivity(this);
    screenHeading = (TextView) findViewById(R.id.screenHeading);
    textToSpeakTextView = (TextView) findViewById(R.id.text_to_speek);
    timerTextView = (TextView) findViewById(R.id.timer);
    statusHintTextView = (TextView) findViewById(R.id.status_hint);
    screenHeadingText = (String) getIntent().getSerializableExtra("heading");
    currentClaimant = (Claimant) getIntent().getSerializableExtra("claimant");
    screenHeading.setText(screenHeadingText);
    if (currentClaimant != null) {
        textToSpeakTextView.setText(currentClaimant.getNextPrompt());
        statusHintTextView.setText(currentClaimant.getStatusHint());
    }
    pushToRecordButton = (Button) findViewById(R.id.pushToRecord);
    pushToRecordButton.setOnTouchListener(this);

}

@Override
public void updateTime(final String time) {

    Log.d("***UPDATE TIME Thread", "Current time:" + time);
    runOnUiThread(new Runnable() {
     public void run() {
     timerTextView.setText(time);
     Log.d("UPDATE TIME Thread", "Current time:"+time);
     Log.d("UPDATE TIME Thread", "Current value:"+timerTextView.getText());
     }
     });

}




@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        VoiceManager.getInstance().startRecording();
        break;
    case MotionEvent.ACTION_UP:
        Log.d("Push Button Down", "Up Event Fired");
        VoiceManager.getInstance().stop();
        String audioDataBase64 = VoiceManager.getInstance().getAudioDateinBase64Encoding();
        if (screenHeadingText.equals("Verification")) {
            VBSServiceManager.getInstance().processVerification(currentClaimant, audioDataBase64);
        } else {
            VBSServiceManager.getInstance().processEnrollment(currentClaimant, audioDataBase64);
        }
        break;
    }
    return false;
}

}

4

2 に答える 2

0

Android では、別のスレッドから UI を更新することはできません。これは、Android 開発における制限 (不要なバグを除去するための機能と考えています) です。これには AsyncTask を使用できます...

使用中は、donInBackground() 内で長いタスクを実行でき、onProgressUpdate() を使用して UI を更新できます... こちらの AsyncTask の例を参照してください

編集

詳細については、この同様の質問を参照してください...

于 2013-02-25T13:21:29.727 に答える