我有一个 Android 应用程序,其Fragment
依赖加载程序来获取数据。下面是我的骨架代码Fragment
。一切都是一样的,只是我在onLoadFinished
方法中有一些自定义代码。
public class Events extends Fragment implements LoaderCallbacks<ArrayList<Event>> {
private Integer intWeek;
public static Events newInstance(Integer intWeek) {
Events pageFragment = new Events();
pageFragment.intWeek = intWeek;
pageFragment.setArguments(new Bundle());
return pageFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.events, null);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);
}
public Loader<ArrayList<Event>> onCreateLoader(int intLoader, Bundle bndBundle) {
return new Scraper(getActivity().getApplicationContext());
}
public void onLoadFinished(Loader<ArrayList<Event>> ldrEvents, final ArrayList<Event> lstEvents) {
//Do something with the returned data
}
public void onLoaderReset(Loader<ArrayList<Event>> ldrEvents) {
return;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
这Fragment
在一个FragmentActivity
which uses ViewPager
which uses which get its Fragment´s using a
FragmentPagerAdapter`中使用。
这很好用,我可以Fragment
像上面显示的那样在 s 之间进行分页。每次Fragment
向 中添加新的时ViewPager
,该onCreate
方法都会触发并创建一个新的Loader
.
当我按下手机上的“主页”按钮时,应用程序会暂停并进入后台。我总是可以恢复应用程序,它工作得很好——在后台运行 5/10/20 分钟后。
...但是如果我将应用程序留在后台很长时间,一个小时或更长时间,应用程序会在启动时崩溃,并且堆栈跟踪指向onCreate
方法中的以下行:
getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);
现在我很迷茫为什么会这样。似乎Android框架在后台长时间不活动后破坏了后台的某些东西,并且该initLoader
方法无法创建Loader
. 关于该initLoader
方法的文档具体说:
确保加载程序已初始化并处于活动状态。如果加载器尚不存在,则创建一个并(如果活动/片段当前已启动)启动加载器。否则,最后创建的加载器将被重新使用。
谁能指出我在这里做错了什么?这似乎是一个很难调试的问题,因为我无法随意复制它。这是非常随机的。谢谢
来自 logcat 的堆栈跟踪:
Transmitting stack trace: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mridang.stadi/com.mridang.stadi.Main}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access$600(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4575)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.mridang.stadi.events.Events.onCreate(Events.java:73)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1805)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)
at com.mridang.stadi.Main.onCreate(Main.java:23)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033)
... 11 more