我最近重构了一个旧项目,发现无论我做什么,特定部分都不再想要正常运行。基本上,我有一个带TextView的Activity。此视图以定时间隔从同一类中调用的线程更新。暂停是通过Thread.sleep完成的,Handler用于触发UI的更新。问题是,现在我要么得到一个CalledFromWrongThreadException,说我无法操纵另一个线程中的View,一个长时间的停顿,然后所有文本立即触及View,或者它似乎立即触发并且根本不睡觉。我以前做过这样的事情(包括相关部分):
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中Handler和Threads的内部工作方式并不十分精明,所以任何指针都会非常受欢迎。
答案 0 :(得分:2)
您正在静态创建处理程序,它在加载程序线程中创建它。在onCreate()中创建处理程序,它将绑定到UI线程,并解决您的问题。此外,您可以在收到消息时执行handler.sendEmptyMessageDelayed,而不是Thread.sleep,只需发送初始消息即可启动。我认为处理程序中的Thread.sleep会堵塞一个帖子。