私は次のクラスを持っています。このクラスの目的は、1 秒間に約 10 文字を表示することにより、テレタイプ/タイプライターをシミュレートできるようにすることです。
CharacterLoopThread クラスのポイントは、outputBuffer を確認することです。その中に文字がある場合は、UI スレッドで runnable を呼び出して、最初の文字を取り出して textView に挿入します。その後、スレッドは約 100 ミリ秒スリープします。(ここにはいくつかの悪ふざけがあります... 1979年にテレタイプを使用したときは素晴らしかったですが、今は私の好みでは少し遅いです.遅延を 100ms にリセットします...)
私の質問とは関係がなかったので、クラスの一番下を編集しました。
私がここに持っているものはうまくいくようです。しかし、それは私のために、または私にもかかわらず機能しますか? スレッドとハンドラーを作成する際に、どのような方法をお勧めしますか?
public class MyActivity extends Activity {
private TextView textView;
private ScrollView scrollView;
private StringBuilder outputBuffer;
private Handler handler;
private CharacterLooperThread characterLooperThread;
(をちょきちょきと切る)
private class CharacterLooperThread extends Thread {
private boolean allowRun;
private Runnable run;
int effectiveCharacterDelay;
int characterCount;
public CharacterLooperThread() {
allowRun = true;
run = new Runnable() {
public void run() {
/**
* Don't do anything if the string has been consumed. This is necessary since when the delay
* is very small it is possible for a runnable to be queued before the previous runnable has
* consumed the final character from the outputBuffer. The 2nd runnable will cause an
* exception on the substring() below.
*/
if (outputBuffer.length() == 0) return;
try {
textView.append(outputBuffer.substring(0, 1));
scrollToBottom();
outputBuffer.deleteCharAt(0);
} catch (Exception e) {
toast(getMsg(e));
}
}
};
}
public void run() {
resetDelay();
while (allowRun) {
/**
* This if() performs 2 functions:
* 1. It prevents us from queuing useless runnables in the handler. Why use the resources if
* there's nothing to display?
* 2. It allows us to reset the delay values. If the outputBuffer is depleted we can reset the
* delay to the starting value.
*/
if (outputBuffer.length() > 0) {
handler.post(run);
reduceDelay();
} else {
resetDelay();
}
try {
Thread.sleep(effectiveCharacterDelay);
} catch (InterruptedException e) {
toast("sleep() failed with " + e.getMessage());
}
}
/**
* Make sure there's no runnable on the queue when the thread exits.
*/
handler.removeCallbacks(run);
}
public void exit() {
allowRun = false;
}