【问题标题】:Chronometer null object reference天文台空对象参考
【发布时间】:2020-03-01 20:15:51
【问题描述】:

我在第二个活动中有一个计时器。我想从主要活动中访问它,所以我将计时器作为公共静态放在第二个活动中,并将“secondActivity.chronometer”放在主要活动中,但是在启动应用程序时它显示chronometer.setbase(long) on a null object reference我检查了xml id是否正确。有谁知道如何解决这个问题?

【问题讨论】:

  • 这是一个糟糕的主意,有几个原因,尤其是因为您几乎肯定会通过维护对View(您的Chronometer)的静态引用来创建内存泄漏。使用Intent 或事件总线或其他机制在两个活动之间进行通信(请参阅stackoverflow.com/questions/21393287/…
  • 因为我实际上想让我的计时器在使用Service 启动主要活动时在后台运行,它是否还必须使用Intent 来访问计时器?不会影响Service吗?
  • “在后台”,我认为你的意思是它不可见?在这种情况下,它不需要运行 - 您只需将计时器的“开始时间”存储在某处,然后,当您的计时器可见可见时,使用时间调用Chronometer#setBase ,它将更新为当时和现在之间的正确差异。看看我的回答。
  • 所以我必须删除Intent,因为它只是直接启动第二个活动,而不是让它在不可见的后台运行?
  • 当然,只要您准备好展示计时器,就可以调用Intent。否则,您只需将该“开始时间”存储在某处。它可能在内存中,或者您可以将其写入SharedPreferences 或其他地方。

标签: android chronometer


【解决方案1】:

您尚未初始化计时器。 当您启动应用程序时,计时器没有任何价值,因为它处于第二个活动中。

【讨论】:

    【解决方案2】:

    当您启动应用程序时,第二个活动未初始化。 chronometer 作为 TextView 的子类,也无法初始化。在其他活动中访问或更改视图不是一个好主意。您可以传输数据并通过数据显示。

    【讨论】:

      【解决方案3】:

      正如我在评论中提到的,保留对 View 的静态引用是一个非常糟糕的主意。首先,正如其他答案已经表明的那样,不能保证您的View 在您调用它时已经被初始化,因为它所属的Activity 可能尚未初始化。但是,它也是内存泄漏的主要原因(请参阅this answer for more detail)。

      我的建议是,不要启动您的Chronometer,而是记下您希望它启动的时间(对于Chronometer,可以通过以下方式获得调用SystemClock#uptimeMillis),将其写入Intent,然后使用它启动您的第二个Activity。然后,您可以将此时间用作Chronometer 的基本时间,因此给人的印象是它一直在运行。即

      public class ActivityOne extends Activity {
          //...
          private void startChronometer() {
              final Intent i = new Intent(this, ActivityTwo.class);
              i.putExtra("time", SystemClock.uptimeMillis());
              startActivity(i);
          }
      }
      
      public class ActivityTwo extends Activity {
      
          private Chronometer chrono;  
      
          @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              //...
              chrono = findViewById(R.id.id_of_chronometer);
              chrono.setBase(getIntent().getLongExtra("time", SystemClock.uptimeMillis()));
              chrono.start();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-13
        • 1970-01-01
        • 2017-08-25
        • 2020-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多