了解新的Intent崩溃

时间:2018-09-22 15:54:39

标签: java android android-intent nullpointerexception

我在Android应用程序中有一行内容,内容如下:

Intent intent = new Intent(this,MyView.class);

不幸的是,似乎有时会崩溃,但是我无法重现崩溃,可能是因为我不知道在什么情况下会失败。如您可能已经猜到的那样,崩溃是java.lang.NullPointerException

通过阅读其他解决方案,我发现可以将this替换为getApplicationContext(),但这仍然无济于事:

  • 在什么情况下可能会发生
  • 为什么this无法正常工作

我当然假设是this的问题-我假设MyView.class永远不会为空,我认为这是正确的吗?

出于完整性考虑,我应该解释一下这是在回调中编写的。这是该功能的完整代码:

 @Override
    public void didReceiveLoginResponse(boolean status) {
        if(status) {
            Intent intent = new Intent(this,MyView.class);
            startActivity(intent);
        } 
    }

非常感谢您提供的有用建议!

编辑:明确地说,我不是在问nullPointerException是什么。我问这行在什么情况下会包含nullPointerException。如果视图不再存在,该函数将如何运行(确保空位将是视图/函数,而不是其中的特定行?)

3 个答案:

答案 0 :(得分:1)

我的猜测是,异步任务完成时(也许有人启动然后快速回击),调用方Activity正在结束或已经结束,在这种情况下上下文不再有效。

尝试检查isFinishing()

答案 1 :(得分:0)

我想是因为我在某些异步任务(例如翻新Callback(在回调中不可能使用this)中看到它,所以您的回调有时会超出主范围的范围威胁活动,这就是为什么您无法获得this个上下文实例的原因。无论如何,有时会发生而有时却不会发生。

我的建议是,如果可能的话,应将this实例作为参数传递给Callback,

 @Override
    public void didReceiveLoginResponse(Activity activity, boolean status) {
        if(status) {
            Intent intent = new Intent(activity,MyView.class);
            startActivity(intent);
        } 
    }

答案 2 :(得分:0)

您应该使用MainActivity.this或任何活动名称进行修改。 例如

@Override
    public void didReceiveLoginResponse(boolean status) {
        if(status && MainActiity.this!=null) {
            Intent intent = new Intent(MainActiity.this,MyView.class);
            startActivity(intent);
        } 
    }