我有以下类。该课程的目的是让我通过每秒显示十个字符来模拟电传打字机。android线程和处理程序最佳实践
CharacterLoopThread类的要点是查看outputBuffer,如果其中包含任何字符,请在UI线程上调用一个可运行的函数,该函数将第一个字符拖动到textView中。线程然后睡觉大约100ms。 (这里有一些诡计......虽然我在1979年使用电报时惊人,但现在对我的口味有点慢,所以每10个字符,我稍微减少延迟,当没有更多字符可显示时,我重置延迟到100毫秒...)
我编辑脱离类的底部,因为它与我的问题没有密切关系。
我在这里有什么似乎很好。但是,它是因为我还是不管我工作?你写什么线程和处理程序的首选方法?
public class MyActivity extends Activity {
private TextView textView;
private ScrollView scrollView;
private StringBuilder outputBuffer;
private Handler handler;
private CharacterLooperThread characterLooperThread;
(SNIP)
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;
}
对于初学者来说,我会* *实现Runnable接口,而不是继承* *线程。这是一种说法:“我有可能独立运行事物”,而不是“我控制线程实际启动和运行的方式”。 – Patrick 2012-04-14 01:28:54