Android 在截击异步操作期间,当用户使用NavigationDrawer更改片段时,应用程序崩溃

Android 在截击异步操作期间,当用户使用NavigationDrawer更改片段时,应用程序崩溃,android,android-fragments,asynchronous,android-volley,Android,Android Fragments,Asynchronous,Android Volley,我基于Android Studio的导航抽屉模板创建了一个应用程序 我有3个片段,每个片段实现各种Vollye异步网络请求 问题是: 当用户在片段a上玩时,触发一个发送截击异步网络请求的操作,并且在获得结果和UI更新之前,它切换到片段B,应用程序显然会引发空指针异常 基本上,片段A的异步网络请求的回调无法更新UI,因为片段A被替换为具有完全不同UI元素的片段B,片段A上下文被破坏 所以,我想问题在于片段交换/切换的逻辑 以下是我的主要活动“onNavigationDrawerItemSelect

我基于Android Studio的导航抽屉模板创建了一个应用程序

我有3个片段,每个片段实现各种Vollye异步网络请求

问题是: 当用户在片段a上玩时,触发一个发送截击异步网络请求的操作,并且在获得结果和UI更新之前,它切换到片段B,应用程序显然会引发空指针异常

基本上,片段A的异步网络请求的回调无法更新UI,因为片段A被替换为具有完全不同UI元素的片段B,片段A上下文被破坏

所以,我想问题在于片段交换/切换的逻辑

以下是我的主要活动“onNavigationDrawerItemSelected”方法,每当用户点击NavigationDrawer元素时调用:

@Override
public void onNavigationDrawerItemSelected(int position)
{
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment frag = null;

    switch (position)
    {
        case 0: // A
            frag = FragmentA.newInstance(position + 1);
            break;
        case 1: // B
            frag = FragmentB.newInstance(position + 1);
            break;
        case 2: // C
            frag = FragmentC.newInstance(position + 1);
            break;
        default:
    }

    if (frag != null)
    {
        fragmentManager.beginTransaction()
                .replace(R.id.container, frag)
                .commit();
    }
}
现在问题很清楚了,每次用户点击NavigationDrawer的元素时,所选片段就会膨胀到布局中,替换(销毁)旧片段

解决这个问题的最好办法是什么

用户可能能够随时在片段之间切换,我不想禁用等待特定异步网络请求结束的UI,并且imho清除截击队列以停止onPause()/onDestroy()方法期间触发的异步请求不是一个好的解决方案。。这不是解决办法

如果用户点击片段B,我想:

  • 检查是否有碎片A的截击排队请求->清除它们
  • 如果触发了任何请求,并且系统正在等待响应,则获取 响应(当它出现时)并在更新或不更新UI的情况下对其进行处理
我想问题在于片段交换逻辑。我必须如何管理片段交换/切换

更新

获取SharedReferences对象时出错的示例:

FATAL EXCEPTION: main
Process: ***************, PID: 21174
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
导致NULLpE的代码。FragmentA的截取异步请求的回调(在FragmentA内部定义和执行),在响应到来时调用(在用户可以切换到FragmentB之后),执行以下操作:

[...]
// we are inside FragmentA
// Volley Async Network Request callback code
APILibrary lib = new APILibrary(getActivity());
[...]
这是API库构造函数方法:

public APILibrary(Context context) {
  this.fooObject = new FooObject(context)
}
这是发生致命异常的FooObject构造函数方法:

public FooObject(Context context) {
    mContext =  context;
    mSharedPrefs = mContext.getSharedPreferences(MYFOOTAG, mContext.MODE_PRIVATE);
}
致命错误的另一个示例

E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.foo.bar, PID: 20676
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
        at android.view.ViewConfiguration.get(ViewConfiguration.java:359)
        at android.view.View.<init>(View.java:3580)
        at android.view.View.<init>(View.java:3675)
        at android.view.ViewGroup.<init>(ViewGroup.java:491)
        at android.widget.LinearLayout.<init>(LinearLayout.java:200)
        at android.widget.LinearLayout.<init>(LinearLayout.java:196)
        at android.widget.LinearLayout.<init>(LinearLayout.java:192)
        at android.widget.LinearLayout.<init>(LinearLayout.java:188)
        at android.widget.TableRow.<init>(TableRow.java:61)
        at com.foo.bar.FragmentA.initTable(FragmentA.java:879)
        at com.foo.bar.FragmentA.parseData(FragmentA.java:681)
        at com.foo.bar.FragmentA$7.update(FragmentA.java:436)
        at com.foo.bar.CustomAPI$1.onResponse(CustomAPI.java:283)
        at com.foo.bar.CustomAPI$1.onResponse(CustomAPI.java:280)
        at com.foo.bar.CustomRequest.deliverResponse(CustomRequest.java:83)
        at com.foo.bar.CustomRequest.deliverResponse(CustomRequest.java:22)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

请发布代码中显示调用
getSharedReferences
的方式和位置的部分。完成!我发布了引发致命异常的代码。您在哪里声明/初始化了MYFOOTAG?请假设代码没有生成编译错误。MYFOOTAG作为静态最终字符串声明到FooObject类中。。正如错误跟踪所解释的,有一个对null引用的方法调用:mContext.getSharedReferences()->mContext为null,因为用户在调用此代码之前切换到另一个片段。我认为它应该是
Context.MODE\u PRIVATE
而不是
mContext.MODE\u PRIVATE
at com.foo.bar.FragmentA.initTable(FragmentA.java:879):
TableRow headrow = new TableRow(getActivity());