Android线程和处理程序无法正常工作

时间:2012-11-25 06:59:30

标签: android multithreading handler runnable

我最近重构了一个旧项目,发现无论我做什么,特定部分都不再想要正常运行。基本上,我有一个带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的内部工作方式并不十分精明,所以任何指针都会非常受欢迎。

1 个答案:

答案 0 :(得分:2)

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