0

我刚开始编写 android 应用程序,现在我遇到了定时器和定时器任务的问题。

在我的应用程序中,我使用计时器来更新 UI,但是当我开始测试它时出现错误,我必须强制关闭它。

这是我的计时器代码:

int delay = 5000; // delay for 5 sec.
int period = 1000; // repeat every sec.

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() 
{
    public void run() 
    {
        moveLettersInCircle();

    }

}, delay, period);

Logcat 是这样说的:

07-30 18:40:12.635: D/dalvikvm(334): GC_EXTERNAL_ALLOC freed 61K, 52% free 2599K/5379K, external 1625K/2137K, paused 52ms
07-30 18:40:16.186: D/dalvikvm(334): GC_EXTERNAL_ALLOC freed 36K, 51% free 2672K/5379K, external 3792K/4025K, paused 40ms
07-30 18:40:21.503: W/dalvikvm(334): threadid=9: thread exiting with uncaught exception (group=0x40015560)
07-30 18:40:21.526: E/AndroidRuntime(334): FATAL EXCEPTION: Timer-0
07-30 18:40:21.526: E/AndroidRuntime(334): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526: E/AndroidRuntime(334):  at android.view.View.setLayoutParams(View.java:5000)
07-30 18:40:21.526: E/AndroidRuntime(334):  at com.jest.womix.Game$1.run(Game.java:104)
07-30 18:40:21.526: E/AndroidRuntime(334):  at java.util.Timer$TimerImpl.run(Timer.java:284)
07-30 18:40:25.666: I/Process(334): Sending signal. PID: 334 SIG: 9

我该如何解决这个问题?

编辑处理程序代码:

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

        moveLettersInCircle(); 
        m_handler.postDelayed(m_handlerTask, 1000);  //Problem: The local variable m_handlerTask may not have been initialized --> But if I initialize it then I get another error in the line m_handlerTask = new Runnable()

      }
      };
     m_handlerTask.run();  

此致

4

1 回答 1

4

我猜你正在从后台线程更新 ui。计时器在不同的线程上运行。

您应该在 ui 线程上更新 ui。利用runOnUiThread

  runOnUiThread(new Runnable() {

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

android.view.ViewRoot$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。

以上通常意味着您正在从另一个线程更新/访问 ui。

您还可以使用一个Handler

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);    

  }
  };
 m_handlerTask.run();   

取消运行m_handler.removeCallbacks(m_handlerTask)

编辑:

     timer.scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {

               runOnUiThread(new Runnable() //run on ui thread
                 {
                  public void run() 
                  { 
                    // update ui here
                  }
                  });
            }
        }, 1000, 1000 );
于 2013-07-30T19:01:29.893 回答