【问题标题】:fatal exception in android Timerandroid Timer中的致命异常
【发布时间】:2013-01-28 08:29:32
【问题描述】:

在我的 android 应用程序中,我正在使用 Timer schedule.but 得到 Timer-0 致命异常,如下所示。我该如何删除它。我还提到了下面的代码 -

01-28 13:44:41.142: E/AndroidRuntime(1307): FATAL EXCEPTION: Timer-0
01-28 13:44:41.142: E/AndroidRuntime(1307):android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.invalidate(View.java:5279)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.setBackgroundDrawable(View.java:7626)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at android.view.View.setBackgroundResource(View.java:7535)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at com.example.iqtest.PlayGame$1.run(PlayGame.java:61)
01-28 13:44:41.142: E/AndroidRuntime(1307):     at java.util.Timer$TimerImpl.run(Timer.java:284)

代码是-

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.next);
    but1=(Button) findViewById(R.id.b1);
    but2=(Button) findViewById(R.id.b2);
    but3=(Button) findViewById(R.id.b3);

    myTimer = new Timer();

    myTimer.schedule(new TimerTask() {      

        @Override
        public void run() {
            Random rand=new Random();
            int num=rand.nextInt(9)+1;

            num = rand.nextInt(buttonIds.length);
            int buttonId = buttonIds[num];
            Button bb=(Button) findViewById(buttonId);

            Drawable a=bb.getBackground();
            if(getResources().getDrawable(R.drawable.happy).equals(a))
             bb.setBackgroundResource(R.drawable.happy);
            else
                bb.setBackgroundResource(R.drawable.whoa);
        }
    },0, 1000);
}

【问题讨论】:

    标签: android timer


    【解决方案1】:

    使用runOnUiThread 从 Timertask 运行方法更新 UI 元素为:

     myTimer.schedule(new TimerTask() {      
    
     @Override
     public void run() {
      Current_Activity.this.runOnUiThread(new Runnable() {
        public void run() {
            // update UI here
        }
     });
     }
    },0, 1000);
    

    【讨论】:

      【解决方案2】:

      您可以使用CountDownTimer 代替Timer

      Timer timer = new CountDownTimer(Long.MAX_VALUE, 1000) {
          public void onTick(long millisUntilFinished) {
              // the code in the method run
          }
      
          public void onFinish() {
      
          }
      };
      

      onTickonFinish 方法将在 UI 线程中调用。

      要让计时器开始执行其操作,请运行:timer.start()

      【讨论】:

      • 注意其他人试图实现这一点:你需要调用 timer.start();让它做任何事情。 :)
      【解决方案3】:

      这很简单,您正在安排计时器但永远不会取消它。所以调度的任务将在队列中等待轮到它。到那时它应该被执行,您的 Activity 可能不在前台,并且无法找到视图。所以它抛出了致命异常。为了解决上述问题,您需要在从该特定活动中调用myTimer.cancel() 时取消任务。

      否则

      使用Handler 类。

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 2013-01-31
        • 1970-01-01
        • 2023-01-27
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多