我在一些设备上遇到错误,在这些设备中,我试图在片段中显示祝酒词。这篇祝酒词通常是关于改造反应失败的。吐司代码很简单。请建议,找不到任何理由到处寻找。
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)发布于 2018-09-12 07:55:18
根据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();
}特别是当您的片段没有附加到某个活动时(如here和here所指出的),可能会发生这种情况。
同样,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组件进行通信。
EventBus或RxJava将是这方面的两种常见解决方案(LocalBroadcastManager将是一种较不常见的方法)。
这将允许任何代码调用您的API,并在API返回时通知订阅。
它还允许您将API响应保存在(例如)本地数据库中,在这种情况下,您只需依赖LiveData模式来更新任何需要的UI。
考虑到某些项目无法立即重新设计,可能需要解决办法。
上面提到的null检查解决方法很有用,因为应用程序不会再崩溃。不幸的是,这确实意味着用户不会被通知失败的API调用。
另一种选择是创建您自己的Application子类(为了初始化公共库,许多项目已经这样做了),并为静态访问此应用程序Context提供了一种方法。(A similar suggestion has subsequently been made by Kushal.)
然后可以选择使用应用程序Toast来显示Context,而不是使用片段中的应用程序Context。您可能会失去从更具体的上下文中获得的任何特定样式,但好处是您的用户仍然可以看到Toast消息。
本文很好地描述了将您的Application公开为单例的情况:
发布于 2018-09-12 07:43:27
有时,当片段与活动无关时,getActivity()或getContext()可能会产生空指针异常。所以使用onAttach方法
public class yourFragment extends Fragment {
Context context
@Override
public void onAttach(Context context) {
this.context = context;
super.onAttach(context);
}
}发布于 2018-09-12 07:50:19
也许getActivity()是在碎片分离时调用的。试试看。
if (isAdded()) {
Toast.makeText(getActivity(), "something", Toast.LENGTH_SHORT).show();
}https://stackoverflow.com/questions/52289744
复制相似问题