如何在一定时间后取消选择视图而不冻结活动

时间:2010-12-11 13:38:52

标签: android multithreading user-interface view

我的代码需要一些好的建议。 这就是我想做的事。

我的活动有一些可由用户选择的视图。假设用户选择了一个视图,我想在5秒之后自动取消选择此视图。 我是通过一个帖子来做的。

当用户选择视图时,我呼叫...

Deselector deselect = new Deselector(mp.getDuration(), clickedview);
deselect.start();   

...在活动中。

取消选择器类:

class Deselector extends Thread
{
int millis=0;
View view = null;

Deselector(int millis, View view)
{
    this.millis = millis;
    this.view = view ; 
}

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        this.sleep(millis);
        view.setSelected(false);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

我的程序崩溃,logkitty说

  

12-11 14:29:37.457:ERROR / AndroidRuntime(3263):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

怎么做对了?

提前致谢

M.D。

2 个答案:

答案 0 :(得分:3)

在小部件或postDelayed()上使用Handler,而不是后台线程,在建议的延迟后继续工作。

答案 1 :(得分:1)

我通过以下方式开始工作

clickedview.postDelayed(new Deselector(clickedview), mp.getDuration());

我的deselctor现在可以运行得更短:

class Deselector implements Runnable
{
View view = null;

Deselector(View view)
{
    this.view = view ; 
}

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        view.setSelected(false);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}