3 回答
TA贡献1805条经验 获得超9个赞
有时,当片段未与活动关联时,getActivity() 或 getContext() 可能会产生空指针异常。所以使用 onAttach 方法
public class yourFragment extends Fragment {
Context context
@Override
public void onAttach(Context context) {
this.context = context;
super.onAttach(context);
}
}
TA贡献2003条经验 获得超2个赞
根据代码和 javadocFragment.getActivity()可以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 未附加到活动时(如此处和此处所指出的),可能会发生这种情况。
同样,getContext()也可以返回null。
在这篇可能相关的帖子中,对这些何时可以为空进行了很好的讨论:
为什么片段中的 getContext() 有时会返回 null?
已经提供了简单的解决方案- 在显示Toast.
但潜在的问题是架构之一 - 您的代码将 API 活动耦合到您的 UI,并假设有关您的 UI 状态的某些事情,即您假设当 API 调用返回时,您的屏幕仍然对用户可见。
更好的解决方案是将 Retrofit 调用与 UI 分离——将 API 调用放在不依赖于 UI 状态的单独类中。
使用事件或发布-订阅框架从这个 API 包装类返回到任何需要知道 API 调用何时返回的 UI 组件。
EventBus或者RxJava将是 2 个常见的解决方案(LocalBroadcastManager将是一种不太常见的方法)。
这将允许任何代码调用您的 API,并在 API 返回时订阅通知。
它还允许您将 API 响应保存在(例如)本地数据库中,在这种情况下,您可以只依赖该LiveData模式来更新任何需要的 UI。
这是一篇 Medium 文章,简要描述了如何使用Repository模式以这种方式使用 Android 架构组件。
鉴于某些项目无法立即重新设计,因此可能需要变通方法。
上面提到的空检查解决方法很有用,因为应用程序将不再崩溃。不幸的是,这确实意味着用户不会收到 API 调用失败的警报。
一种替代方法是创建您自己的Application子类(许多项目已经这样做了以初始化公共库)并提供一种静态访问此应用程序的方法Context。(Kushal 随后也提出了类似的建议。)
然后,您可以选择显示Toast使用应用程序Context而不是片段中的应用程序。您可能会丢失从更具体的上下文中获得的任何特定样式,但好处是您的用户仍然可以看到Toast消息。
添加回答
举报