【问题标题】:Random null pointer onTick of countdowntimer倒计时的随机空指针onTick
【发布时间】:2026-01-26 13:40:02
【问题描述】:

我的问题源于我的倒计时服务课程。 onTick 方法抛出随机空指针。足够随机,很难捕捉到,但每次都会使应用程序崩溃。 这是倒计时服务类的代码

  @Override  
     public void onCreate() {
      super.onCreate();

    stopNotify();

    Log.i(TAG, "Starting timer...");

    cdt = new CountDownTimer(900000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            long millis = millisUntilFinished;
            String hms = String.format("%02d:%02d",
                    TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                    TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
            MainActivity.tv.setText(hms);
            Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
            bi.putExtra("countdown", millisUntilFinished);
            sendBroadcast(bi);
        }

        @Override
        public void onFinish() {
            Log.i(TAG, "Timer finished");

            showNotification();

            savepref();



            Intent intent = new Intent(BroadcastService.this, MainActivity.class);


            intent.putExtra("id1",id1);

            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


            startActivity(intent);





        }
    };

    cdt.start();
}



@Override
public void onDestroy() {
    cdt.cancel();
    Log.i(TAG, "Timer cancelled");
    super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {

    return null;
}

更多代码 代码!!

       private BroadcastReceiver br = new 
      BroadcastReceiver() 
      { 
       @Override
      public void onReceive(Context context, Intent intent) {
        updateGUI(intent); // or whatever method used to 
        update your GUI fields
        }
        };

       private void updateGUI(Intent intent) {
        if (intent.getExtras() != null) {
        long millisUntilFinished = 
        intent.getLongExtra("countdown", 0);
          Log.i(TAG, "Countdown seconds remaining: " + 
          millisUntilFinished / 1000);
             }
          }

【问题讨论】:

  • 我认为你还没有初始化 bi 变量
  • 哪个变量人?
  • 可能是因为您正在从您的服务更新您的 UI 组件。
  • 有更好的方法吗?或者确保它不会崩溃的方法?
  • 你能发一下logcat吗?

标签: android exception nullpointerexception android-service


【解决方案1】:

虽然,我不知道你的其余代码,但显然问题出在这一行

MainActivity.tv.setText(hms);

我猜,“tv”代表一个文本视图,你在 MainActivity 的一个静态变量中获取了它。这变为空..

【讨论】:

  • 是的,它是一个文本视图。无论如何要防止它变为空?该服务更新文本视图
  • 您不应该对视图使用任何静态引用。您可以绑定服务和 MainActivity。这是一个示例-*.com/questions/14695537/… 或者您可以从服务发送广播,并将活动注册为广播接收器。
  • 好的,我将服务绑定到主要活动并让它更新文本视图?
  • 没错。您也可以使用广播接收器。
  • 好吧,这个例子仍然有问题,这个例子并没有真正的帮助,而且里面还有很多额外的东西。我不确定如何设置文本视图