0

我最近重构了一个旧项目,发现无论我做什么,特定部分都不再希望正常运行。本质上,我有一个带有 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 中处理程序和线程的内部工作原理不是很了解,所以任何指针都会非常受欢迎。

4

1 回答 1

2

您正在静态创建处理程序,它在加载程序线程中创建它。在 onCreate() 中创建处理程序,它将绑定到 UI 线程,并解决您的问题。此外,您可以在收到消息时执行handler.sendEmptyMessageDelayed而不是 Thread.sleep,并且只需发送初始消息即可开始。我认为处理程序中的 Thread.sleep 会阻塞线程。

于 2012-11-25T07:07:09.083 回答