首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示空指针expn的Android片段中的Toast

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

Stack Overflow用户
提问于 2018-09-12 07:30:53
回答 6查看 1.5K关注 0票数 0

我在一些设备上遇到错误,在这些设备中,我试图在片段中显示祝酒词。这篇祝酒词通常是关于改造反应失败的。吐司代码很简单。请建议,找不到任何理由到处寻找。

代码语言:javascript
复制
Toast.makeText(getActivity(), "Connection Failure", Toast.LENGTH_LONG).show();

我的ST记录在下面。

代码语言:javascript
复制
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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-09-12 07:55:18

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

代码语言:javascript
复制
/**
 * 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();
}

特别是当您的片段没有附加到某个活动时(如herehere所指出的),可能会发生这种情况。

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

在这个可能相关的帖子中,我们很好地讨论了这些值何时为空:

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

但根本的问题是体系结构--您的代码正在将API活动耦合到您的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。

pattern.

考虑到某些项目无法立即重新设计,可能需要解决办法。

上面提到的null检查解决方法很有用,因为应用程序不会再崩溃。不幸的是,这确实意味着用户不会被通知失败的API调用。

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

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

本文很好地描述了将您的Application公开为单例的情况:

票数 4
EN

Stack Overflow用户

发布于 2018-09-12 07:43:27

有时,当片段与活动无关时,getActivity()或getContext()可能会产生空指针异常。所以使用onAttach方法

代码语言:javascript
复制
public class yourFragment extends Fragment {
   Context context

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

Stack Overflow用户

发布于 2018-09-12 07:50:19

也许getActivity()是在碎片分离时调用的。试试看。

代码语言:javascript
复制
if (isAdded()) {
    Toast.makeText(getActivity(), "something", Toast.LENGTH_SHORT).show();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52289744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档