Android 在截击异步操作期间,当用户使用NavigationDrawer更改片段时,应用程序崩溃
我基于Android Studio的导航抽屉模板创建了一个应用程序 我有3个片段,每个片段实现各种Vollye异步网络请求 问题是: 当用户在片段a上玩时,触发一个发送截击异步网络请求的操作,并且在获得结果和UI更新之前,它切换到片段B,应用程序显然会引发空指针异常 基本上,片段A的异步网络请求的回调无法更新UI,因为片段A被替换为具有完全不同UI元素的片段B,片段A上下文被破坏 所以,我想问题在于片段交换/切换的逻辑 以下是我的主要活动“onNavigationDrawerItemSelected”方法,每当用户点击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
@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的情况下对其进行处理
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());