广播接收器中的Android倒数计时器不会更新TextView

时间:2014-06-05 09:14:05

标签: java android multithreading timer android-activity

我正在创建适用于SMS服务和 FTP 网络的应用程序。

如果用户未建立连接,它将尝试在30秒内重新连接。

我正在使用带有TextView的CountDownTimer来通知用户有关重新连接的时间。

要么成功要么会重新开始计算。

我的问题是,如果当活动在后台或屏幕被锁定时计数器重新启动,TextView会持续显示数字" 1" (它不会更新)直到计时器再次在前台重新启动(但是在没有计时器重启的情况下更新数字在后台或锁定中工作正常,我在前台服务中使用唤醒锁。)

当应用程序处于前台时,计数器再次重启(因此它不会停止计数),一切恢复正常,TextView从冻结的" 1"更新到" 30" 并开始倒计时到" 1"

我认为问题将在计数器线程和背景活动之间与UI进行沟通,但我对此一无所知。

我尝试了几件事:

  1. 创建setter和getter for miliseconds并在每个中更新它们 勾选,然后尝试从onReume()更新textview,没有用。
  2. 为计时器内的TextView创建局部变量,在onTick()内初始化它 尝试从那里更新文本,也没有工作。
  3. 感谢大家的帮助,我会批评任何建议。

    与问题相关的部分代码:

    private CountDownTimer cdt = null;
    private final TextView getTextView_ActivityMainMenu_Timer(){
      return (TextView) findViewById(R.id.ActivityMainMenu_TextView_Timer);
    }
    
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
    
        if(intent.getBooleanExtra("KEY_FAILED", false)){
    
          cdt = new CountDownTimer(30000, 1000) {
    
            public void onTick(long millisUntilFinished) {          
              getTextView_ActivityMainMenu_Timer().setText("" + millisUntilFinished / 1000);                             
            }
    
            public void onFinish() {                        
              ;                     
            }
    
          }
          .start();
    
        }
        else
        {
          if(cdt != null)
            cdt.cancel();
        }
      }
    }; 
    

1 个答案:

答案 0 :(得分:0)

最后我找到了这个问题的解决方案。我没有意识到我在onPause()方法中取消注册接收器。所以我不得不改变它并将广播注册到onResume()并仅在onDestroy()方法中取消注册。