【问题标题】:NullPointerException at Timer计时器出现 NullPointerException
【发布时间】:2014-01-27 14:45:17
【问题描述】:

我收到此错误。不在任何设备上,只是在某些设备上。 这是所有报告:

java.lang.NullPointerException
at eu.innovaapps.tpark.ro.MainSms$4$1$1.run(MainSms.java:444)
at java.util.Timer$TimerImpl.run(Timer.java:284)

它来自:

buton.setEnabled(false);

                        Timer buttonTimer = new Timer();
                        buttonTimer.schedule(new TimerTask() {

                            @Override
                            public void run() {
                                getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        buton.setEnabled(true);
                                    }
                                });
                            }
                        }, 5000);

当我按下按钮时,它会被禁用,5 秒后它会再次启用。 第 444 行是getActivity().runOnUiThread(new Runnable() {。 如果您能帮我解决这个错误,我将不胜感激。

编辑: 我遇到了和这里一样的问题: Scheduled Task in Fragment returns getActivity as null

如果按钮处于禁用状态,并且我按下手机的后退按钮,我会收到此错误,该错误会在这部分代码中发送给我。 如果按下后退按钮,有什么方法可以停止计时器?

【问题讨论】:

  • 你在代码中究竟是从哪里得到 npe 的??
  • 我认为 npe 在 getActivity() 或按钮上。这段代码是写在一个fragment的onCreateView方法中?
  • 写在片段的onStart方法中
  • getActivity().runOnUiThread(new Runnable() { 这是第 444 行

标签: android nullpointerexception


【解决方案1】:

你能告诉你代码中的第 444 行是什么吗?

如果第 444 行是 buton.setEnabled(true);,那么您可以修改代码以在 buton.setEnabled(true); 之前添加 Button button = (Button) findViewById(R.id. 然后尝试相同的代码。

编辑

亲爱的维克多,

我已经阅读了您的编辑...我曾经遇到过这样的异常...为了解决这个问题,我所做的是我在 Activity 类中声明了静态变量...

public static sActivity = null;

然后在 Activity 的 onCreate 方法中,我将当前的活动分配给它...

sActivity = this;

然后在代码中使用它而不是getActivity()...

所以例如我的活动名称是 myActivity,那么在这种情况下您的代码可能会更改为...

 @Override
 public void run() {
      getActivity().runOnUiThread(new Runnable() 




  @Override
     public void run() {
          if (myActivity.sActivity != null) {
              myActivity.sActivity.runOnUiThread(new Runnable() 
          .
          .
          .
          }

如果您找到其他更好的解决方案,请告诉我...

【讨论】:

  • 这是 npe 行:getActivity().runOnUiThread(new Runnable() {
【解决方案2】:
Timer notificationtask = new Timer();
notificationtask.schedule(new TimerTask() 
{
    @Override
    public void run() {
        // TODO Auto-generated method stub

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try {
                            buton.setEnabled(true);

                    } catch (Exception e) {
                    }
                }
            });

    }
}, 1000, 1000);

【讨论】:

  • SO 不赞成纯代码的答案。请解释为什么这个答案应该有帮助以及你做了什么。另外,请花时间正确格式化您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多