【问题标题】:Android Countdown Timer in Broadcast receiver doesn't update TextView广播接收器中的 Android 倒数计时器不会更新 TextView
【发布时间】:2014-06-05 09:14:05
【问题描述】:

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

如果用户没有建立连接,它将在 30 秒后尝试重新连接。

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

要么成功,要么重新开始计数。

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

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

我认为问题将出在计数器线程和后台活动与 UI 之间的通信中,但我对此一无所知。

我尝试了几种方法,例如:

  1. 为毫秒创建 setter 和 getter 并在每个毫秒内更新它们 打勾,然后尝试从onReume() 更新textview,没有用。
  2. 在定时器内部为TextView创建局部变量,在onTick()内部初始化它和 尝试从那里更新文本,也没有用。

感谢大家的帮助,有什么建议我都会采纳的。

与问题相关的部分代码:

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

【问题讨论】:

    标签: java android multithreading timer android-activity


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多