【问题标题】:Volley onErrorResponse getString occassionally returns nullVolley onErrorResponse getString 偶尔返回 null
【发布时间】:2018-06-12 13:55:23
【问题描述】:

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

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 获取动态值运行时的资源会有所不同。

根据我收集到的信息,活动实例可能会因使用可能导致此问题的异步网络调用而有所不同。我还考虑过单独使用 getString() 以及 getResources().getString(),但我不确定这是否会阻止问题的出现.

【问题讨论】:

    标签: java android android-asynctask android-volley


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回复 - 我将直接尝试一下,因为我还没有尝试过这种组合,特别是考虑使用 getActivity() 来获取可能明显改变的当前活动。使用 setActivity() 方法的唯一原因是最初传入从 onAttach 生命周期调用生成的上下文,如果不是 onActivityCreated 生命周期调用,建议在此获取活动实例。一旦我认为它解决了问题,我会更新以将您的建议标记为答案。
    猜你喜欢
    • 2014-01-04
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多