Volley onErrorResponse getString偶尔返回null

时间:2018-01-02 21:30:24

标签: java android android-asynctask android-volley

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

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 <的每个生命周期调用中调用/ 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以及如何确保应用程序不会崩溃,但我需要从字符串中获取动态值运行时的资源会有所不同。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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