Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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片段中的Toast显示空指针表达式_Java_Android_Toast_Android Toast - Fatal编程技术网

Java Android片段中的Toast显示空指针表达式

Java Android片段中的Toast显示空指针表达式,java,android,toast,android-toast,Java,Android,Toast,Android Toast,我在一些设备上遇到错误,我试图在片段中显示一个吐司。这通常与改装响应故障有关。toast代码很简单。请建议,找不到任何理由到处搜索 Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show(); 下面是我的ST日志 Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.S

我在一些设备上遇到错误,我试图在片段中显示一个吐司。这通常与改装响应故障有关。toast代码很简单。请建议,找不到任何理由到处搜索

Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();
下面是我的ST日志

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
   at android.widget.Toast.(Toast.java:103)
   at android.widget.Toast.makeText(Toast.java:256)

您的活动
上下文在此行中为空:

Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();// getActivity() is null
要避免崩溃,请使用以下命令:

if(getActivity() != null)
   Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();
有时,当片段与活动不关联时,getActivity()或getContext()可能会产生空指针异常。因此,请使用NANTACH方法

public class yourFragment extends Fragment {
   Context context

   @Override
   public void onAttach(Context context) {
        this.context = context;
        super.onAttach(context);
   }
}

getActivity()
更改为
getContext()
。请尝试下面给定的代码:

Toast.makeText(getContext(), "Connection Failure", Toast.LENGTH_LONG).show();
片段分离时可能调用
getActivity()
。试试看

if (isAdded()) {
    Toast.makeText(getActivity(), "something", Toast.LENGTH_SHORT).show();
}

根据
Fragment.getActivity()
的代码&javadoc,您可以得到
null
返回:

/**
 * Return the {@link FragmentActivity} this fragment is currently associated with.
 * May return {@code null} if the fragment is associated with a {@link Context}
 * instead.
 *
 * @see #requireActivity()
 */
@Nullable
final public FragmentActivity getActivity() {
    return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
尤其是当您的片段未附加到活动时(如和所指出的),可能会发生这种情况

类似地,
getContext()
也可以返回null

在这篇可能相关的文章中,有一个很好的讨论,关于这些内容何时可以为空:


-在显示
Toast
之前,进行空检查

但潜在的问题是架构问题——您的代码将API活动与UI耦合,并假设有关UI状态的某些事情,即您假设当API调用返回时,用户仍然可以看到您的屏幕


更好的解决方案是将改装调用与UI-分离

使用事件或发布子框架从此API包装器类通信回需要知道API调用何时返回的任何UI组件

EventBus
RxJava
将是这方面的两种常见解决方案(
LocalBroadcastManager
将是一种不太常见的方法)

这将允许任何代码调用API,并在API返回时订阅通知

它还允许您将API响应保存在(例如)本地数据库中,在这种情况下,您可以依靠
LiveData
模式来更新任何需要更新的UI


鉴于某些项目无法立即重新设计,可能需要采取变通办法

上面提到的空检查解决方案非常有用,因为应用程序将不再崩溃。不幸的是,这确实意味着用户将不会收到失败API调用的警报

一种替代方法是创建自己的
应用程序
子类(许多项目已经这样做了,以便初始化公共库),并提供一种静态访问该应用程序
上下文的方法

然后,您可以选择使用应用程序
上下文来显示
Toast
,而不是片段中的内容。您可能会丢失从更具体的上下文中获得的任何特定样式,但好处是您的用户仍然可以看到
Toast
消息

将您的
应用程序
作为一个单例公开在这篇文章中描述得非常好:

或者试试这个

if(getActivity() != null)
   Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();
在我的例子中,这两种方法都可以很好地工作,因为在某些情况下,片段分离时会调用
getActivity()


因此,我们也必须注意这一点。

在Syed Danish Haider中使用getContext()而不是getActivity()。谢谢你的回答……请你帮我理解一下你的建议……我已经发布了答案供你参考,请接受我的答案,如果它有助于在全局变量中保存应用程序上下文,并使用该全局变量而不是getActivity()@Kushal我喜欢这样-我们必须想法一致。大约在你发布这篇文章的同时,我把它加入了我的答案中。我还提供了一个链接,指向使用Singleton模式完成此操作的代码。可能并非所有情况下都是最好的,但对于像这样棘手的情况,这是一个很好的解决方法。请注意,
getContext()
也可以返回空值。谢谢您的详细解释。我可以把崩溃的原因联系起来。到目前为止,架构更改可能还不太可能。我将把这一点与您的建议一起保留,以备将来计划之用。100%理解重新构建现有代码的困难,这就是我专门链接到其他答案的原因-如果(x!=null){}
检查,我有很多代码可以执行简单的
,但是
getActivity()
/
getContext()似乎是一个常见的误解
始终可用,因此我认为这类问题的详细答案可能对未来的读者有用。@BharatKumar我添加了另一种解决方法,以便您仍然可以使用应用程序上下文向用户显示Toast-这可能比根本不显示任何内容更有用。
if(getActivity() != null)
   Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();