为了账号安全,请及时绑定邮箱和手机立即绑定

显示空指针 expn 的 Android 片段中的 Toast

显示空指针 expn 的 Android 片段中的 Toast

呼唤远方 2021-09-15 14:42:46
我在尝试在片段内显示吐司的少数设备上遇到错误。这种吐司通常是在改造响应失败。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)
查看完整描述

3 回答

?
Cats萌萌

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);

   }

}


查看完整回答
反对 回复 2021-09-15
?
湖上湖

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消息。


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信