Volley onErrorResponse getString偶尔返回null

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Volley onErrorResponse getString偶尔返回null相关的知识,希望对你有一定的参考价值。

如果有人可以共享这个看似简单的问题的解决方案,那就太好了,因为我的应用程序在尝试使用我的应用程序中的以下行在简单的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)

我确保使用以下函数初始化Activity sActivity变量,该函数在onAttach的每个生命周期调用中调用,以确保它可用:

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以及如何确保应用程序不会崩溃,但我需要在运行时从字符串资源中获取动态值,这些值会有所不同。

根据我收集的内容,活动实例可能会因异步网络调用而异,从而导致此问题。我也考虑过单独使用getString()以及getResources()。getString(),但我不确定这是否会阻止问题的产生。

答案

您不应该将活动传递给片段并以此方式存储,这可能是您的问题的原因。只需从片段内部使用getActivity()

此外,您的setActivity代码不能保证sActivity不会为null。如果所有3个条件碰巧都为空,会发生什么?没有最后的其他方法来捕捉所有3都为空的情况。此外,Android可能有时候很有趣,而片段/活动正在膨胀。在OnAttach时,所有这三个变量都很有可能是空的。无论哪种方式,如果你在OnCreate中使用它或者片段完全膨胀后,getActivity()应该返回你需要的东西。你不应该有一个活动变量,因为getActivity完全符合你的需要,当活动发生变化时会发生什么,但是你有一个旧版本存储在内存中你尝试调用方法?

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

总而言之,您的代码行应该是这样的(不需要您的setActivity方法或sActivity变量)。

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

已经有一段时间了,所以请告诉我这是否对您不起作用,我可以尝试进一步帮助您。

以上是关于Volley onErrorResponse getString偶尔返回null的主要内容,如果未能解决你的问题,请参考以下文章

error.networkResponse 为空时 Android Volley 中的 Http 状态代码

如何处理 Android API 23 中的 volley(删除相关的 apache http 包)?

volley3--Volley类

Volley源码解析——从实现角度深入剖析volley

深入volley自己来写volley

反应原生找不到 com.android.volley:volley:1.1.1