java - Volley onErrorResponse getString 偶尔返回 null

标签 java android android-asynctask android-volley

如果有人可以分享这个看似简单问题的解决方案,那就太好了,因为当我的应用程序在简单 Volley 的 onErrorResponse 部分中尝试使用我的应用程序中的以下行获取字符串资源时,会崩溃请求:

mTextView.setText(sActivity.getString(R.string.connection_error, 
customMessageParameter));

此问题似乎仅发生在某些用户身上(尽管我自己尝试复制崩溃),这是通过 Fabric 报告的,即以下内容:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual 
method 'java.lang.String android.content.Context.getString(int)' on a null 
object reference at 
com.appname.MyFragment$13.onErrorResponse(MyFragment.java:651)

我确保使用以下函数初始化ActivitysActivity变量,该函数在onAttach<的每个生命周期调用中调用/em> 确保其可用:

private void setActivity(Activity activity, Context context) {
    if (activity != null) {
        sActivity = activity;
    } else if (getActivity() != null) {
        sActivity = getActivity();
    } else if (context != null) {
        sActivity = (Activity) context;
    }
}

我了解如何事先检查 getString() 调用不等于 null 以及如何确保应用程序不会崩溃,但我需要从 String 获取动态值运行时的资源会有所不同。

根据我收集的信息, Activity 实例可能会因使用异步网络调用而发生变化,从而导致此问题。我也考虑过单独使用 getString() 以及 getResources().getString(),但我不确定这是否会阻止问题的出现.

最佳答案

您不应该将 Activity 传递给 fragment 并以这种方式存储它,这可能是问题的原因。只需从 fragment 内部使用 getActivity() 即可。

此外,您的 setActivity 代码不一定保证 sActivity 不会为 null。如果所有 3 个条件都为空,会发生什么?没有最后的 else 来捕获所有 3 个都为空的情况。另外,当 fragment/Activity 不断膨胀时,Android 有时会很时髦。在 OnAttach 时,这 3 个变量很可能都为空。无论哪种方式,如果您在 OnCreate 中或在 Fragment 完全膨胀后使用它,getActivity() 应该返回您需要的内容。您不应该有 Activity 变量,因为 getActivity 正是您所需要的,当 Activity 发生变化但您尝试在内存中存储旧版本的 Activity 并尝试调用方法时会发生什么?

此外,请使用 getResources().getString(),因为您是从字符串资源中获取字符串。

总而言之,您的代码行应该如下所示(不需要 setActivity 方法或 sActivity 变量)。

getActivity().getResources().getString(R.string.connection_error)

已经有一段时间了,如果这对您不起作用,请告诉我,我可以尽力为您提供进一步帮助。

关于java - Volley onErrorResponse getString 偶尔返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48068101/

相关文章:

通过 LAN 使用 TCP/IP 进行 Java 聊天

android - CoordinatorLayout 与 RecyclerView : onScroll

Android 通知只显示一次

java - 有没有类似于传统线程的onPreExecute和onPostExecute的东西?

java - 如何将 maven 原型(prototype)从 mvncentral 添加到本地 archetype-repo.xml

java - (Class<?>) 和 getClass() 有什么区别?

java - SOAP 体采用 utf-8 编码两次

android - 如何在 Android Studio 3.0 中设置构建变体配置字段和资源值?

java - 使用具有多个静态 AsyncTask 的静态类有什么缺点吗?

java - Android 9.0 (Pie) 不支持异步任务