本文介绍了定时器/ TimerTask的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚开始的Andr​​oid应用程序编程及现在我有一个定时器和定时器任务出现了问题。

在我的应用我用一个定时器来更新UI,但是当我开始测试它得到一个错误,我必须强迫关闭它。

下面是我的定时器code:

  INT延迟= 5000; // 5秒的延迟。
INT周期= 1000; //重复每秒。定时器定时器=新的Timer();
timer.scheduleAtFixedRate(新的TimerTask()
{
    公共无效的run()
    {
        moveLettersInCircle();    }},延迟期);

LogCat中这样说:

  07-30 18:40:12.635:D / dalvikvm(334):GC_EXTERNAL_ALLOC释放61K,52%免费2599K / 5379K,1625K外部/ 2137K,暂停52ms
07-30 18:40:16.186:D / dalvikvm(334):GC_EXTERNAL_ALLOC释放36K,51%免费2672K / 5379K,3792K外部/ 4025K,暂停40毫秒
07-30 18:40:21.503:W / dalvikvm(334):主题ID = 9:螺纹未捕获的异常(组= 0x40015560)退出
07-30 18:40:21.526:E / AndroidRuntime(334):致命异常:定时器0
07-30 18:40:21.526:E / AndroidRuntime(334):$ android.view.ViewRoot CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程。
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.setLayoutParams(View.java:5000)
07-30 18:40:21.526:E / AndroidRuntime(334):在com.jest.womix.Game $ 1.run(Game.java:104)
07-30 18:40:21.526:E / AndroidRuntime(334):在java.util.Timer中的$ TimerImpl.run(Timer.java:284)
07-30 18:40:25.666:I /流程(334):发送信号。 PID:334 SIG:9

我该如何解决呢?

编辑HANDLER code:

 处理程序m_handler;
    可运行m_handlerTask;
    m_handler =新的处理程序();
    m_handlerTask =新的Runnable()
    {
      @覆盖
      公共无效的run(){        moveLettersInCircle();
        m_handler.postDelayed(m_handlerTask,1000); //问题:局部变量m_handlerTask可能没有被初始化 - >但是,如果我将其初始化然后我得到了行m_handlerTask =新的Runnable其他错误()      }
      };
     m_handlerTask.run();

最好的问候


解决方案

我猜你是从backgroudn线程更新界面。定时器运行在不同的线程。

您应该更新UI线程UI。使用 runOnUiThread

  runOnUiThread(新的Runnable(){                    @覆盖
                    公共无效的run(){
                       //这里更新UI。
                    }
                });

The above generally means you are updaint/acessing ui from another thread.

You can also use a 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();   

To cancel the run m_handler.removeCallbacks(m_handlerTask).

Edit:

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

               runOnUiThread(new Runnable() //run on ui thread
                 {
                  public void run() 
                  { 
                    // update ui here
                  }
                  });
            }
        }, 1000, 1000 );

这篇关于定时器/ TimerTask的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-12 01:37