我最近重构了一个旧项目,发现无论我做什么,特定部分都不再希望正常运行。本质上,我有一个带有 TextView 的 Activity。这个视图是从同一个类中调用的线程定时更新的。暂停是通过 Thread.sleep 完成的,并且使用 Handler 来触发 UI 的更新。问题是,现在我要么得到一个 CalledFromWrongThreadException ,说我无法从另一个线程操作视图,而是长时间停顿,然后所有文本立即击中视图,或者它似乎立即触发并且根本不睡觉。我以前这样做过(包括相关部分):
public class Updated extends Activity implements Runnable {
private TextView textView;
private String text;
private Handler handle = new Handler(){
@Override
public void handleMessage(Message msg){
textView.append(text);
}
};
//onCreate and other such things...{
new Thread(this).start();
}
public void run(){
//A healthy chunk of logic/conditionals
text = "Blah blah";
handle.sendEmtpyMessage(0);
try {
Thread.sleep(1500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
这就是我之前使用的要点,效果很好。但是,我真的不喜欢设置类变量然后让 Handler 稍后抓取它的做法。我对其进行了修改以传递一个将 .obj 字段设置为字符串的消息,然后将其剥离并附加到 TextView。这会因上述异常而崩溃。我尝试将 Handler 声明留在原处,但将其中的逻辑移动到 Handler 将 .post(Runnable(){}); 具有相同的胆量,但这只会在长时间等待后停止并附加它。我对 Java/Android 中处理程序和线程的内部工作原理不是很了解,所以任何指针都会非常受欢迎。