如何使用计时器线程和视图

时间:2013-05-29 19:43:45

标签: android multithreading view

我的问题是: 我写了一个小的Android应用程序,它使用了很多ImageViews。 他们的图像必须在代码中更改。 到目前为止,它工作得很好,但我想添加一种显示正确答案的算法(这是一个游戏)。 它们应该一个接一个地出现。

public void x (int current,final View v)
{
    c = current;
    if(attached[current])
    {
        apply_change(c);
    }
    if(current < 34)
    {
        if(attached[current+1])
        {
            new java.util.Timer().schedule(new java.util.TimerTask(){
                public void run(){
                    x(c+1,v);
                }},500);
        }
        else
        {
            x(c+1,v);
        }
    }
    else
        new java.util.Timer().schedule(new java.util.TimerTask(){
            public void run(){
                //NewGame_Click(v);
                finished = true;
            }},1);
}

从这些线程中我无法更改我的ImageViews的图像(CalledFromWrongThreadException)。 所以我试着这样做:

while(!finished)
    {
        akt();
    }

在我的UI线程中。 问题是,我的akt();函数(它改变了图像)运行,但是在没有完成所有的Timer-Threads之前,我的Debug-Phone的屏幕上都看不到任何东西。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

使用处理程序。计时器任务在不同的线程上运行。所以你不能从它更新ui。您应该在主UI线程上更新ui。你可以在timer tak run方法中使用handler或runonuithread来更新ui。但我建议你使用处理程序

       Handler m_handler;
       Runnable m_handlerTask ;  
       m_handler = new Handler();
       m_handlerTask = new Runnable()
       {
         @Override 
         public void run() {

                   // do something 
              m_handler.postDelayed(m_handlerTask, 1000); // instad of 1000 mention the delay in milliseconds
         }
       };
       m_handlerTask.run(); 

或使用

           runOnUiThread(new Runnable(){

              @Override
              public void run(){
                //update ui here

              }
           });