gpt4 book ai didi

java - Android fragment 中的 Toast 显示空指针 expn

转载 作者:行者123 更新时间:2023-12-01 06:34:17 24 4
gpt4 key购买 nike

我在尝试在 fragment 内显示 toast 的少数设备上遇到错误。此 toast 通常是在改造响应失败时。 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)

最佳答案

根据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();
}

特别是当您的 Fragment 未附加到 Activity 时,可能会发生这种情况(如 herehere 所指出的)。

同样,getContext()也可以返回 null。

在这个可能相关的帖子中,关于这些何时可以为 null 进行了很好的讨论:

<小时/>

The simple solution has been provided already - 在显示 Toast 之前进行空检查.

但根本问题是架构之一 - 您的代码将 API Activity 耦合到您的 UI,并假设有关您的 UI 状态的某些事情,即您假设当 API 调用返回时,您的屏幕仍然对用户可见。

<小时/>

更好的解决方案是将 Retrofit 调用与 UI 分离 - put the API calls in a separate class that does not depend on the UI state .

使用事件或发布-订阅框架从此 API 包装器类与需要知道 API 调用何时返回的任何 UI 组件进行通信。

EventBusRxJava这将是两种常见的解决方案(LocalBroadcastManager将是一种不太常见的方法)。

这将允许任何代码调用您的 API,并订阅 API 返回时收到的通知。

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

Here's a Medium article giving a brief description of how to use the Android Architecture Components in this manner using the Repository pattern.

<小时/>

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

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

另一种选择是创建您自己的 Application子类(许多项目已经这样做了,以便初始化公共(public)库)并提供静态访问此应用程序的方法 Context(A similar suggestion has subsequently been made by Kushal.)

然后您可以选择显示 Toast使用应用程序Context而不是 fragment 中的那个。您可能会丢失从更具体的上下文中获得的任何特定样式,但优点是您的用户仍然可以看到 Toast消息。

暴露您的Application这篇文章对单例进行了很好的描述:

关于java - Android fragment 中的 Toast 显示空指针 expn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com