Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 广播接收器中的Android倒数计时器不更新TextView_Java_Android_Multithreading_Timer_Android Activity - Fatal编程技术网

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

Java 广播接收器中的Android倒数计时器不更新TextView,java,android,multithreading,timer,android-activity,Java,Android,Multithreading,Timer,Android Activity,我正在创建的应用程序与短信服务和FTP网络工程 如果用户未建立连接,它将在30秒内再次尝试重新连接 我正在使用带有文本视图的倒计时来通知用户重新连接的剩余时间 要么成功,要么重新开始计数 我的问题是,如果计数器在活动处于后台或屏幕被锁定时重新启动,TextView会一直显示数字1,它不会更新,直到计时器在前台重新启动,但在没有计时器重新启动的情况下更新数字在回退或锁定时工作正常,我在前台服务中使用wakelock 在计数器重新启动后,当应用程序在前台时,它不会停止计数,一切都恢复正常,TextV

我正在创建的应用程序与短信服务和FTP网络工程

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

我正在使用带有文本视图的倒计时来通知用户重新连接的剩余时间

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

我的问题是,如果计数器在活动处于后台或屏幕被锁定时重新启动,TextView会一直显示数字1,它不会更新,直到计时器在前台重新启动,但在没有计时器重新启动的情况下更新数字在回退或锁定时工作正常,我在前台服务中使用wakelock

在计数器重新启动后,当应用程序在前台时,它不会停止计数,一切都恢复正常,TextView从冻结的1更新到30,并开始倒计时到1

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

我尝试了以下几种方法:

创建setter和getter达毫秒,并在每次更新中更新它们 勾选,然后尝试从onReume更新textview,不起作用。 在计时器内为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();
    }
  }
}; 

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