我有一個Android應用程序,它的Fragment
依靠裝載器來獲取數據。以下是我的Fragment
的框架代碼。除了我在onLoadFinished
方法中有一些自定義代碼外,所有內容都是相同的。長時間不活動後無法創建新的Loader
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
使用利用ViewPager
它得到其Fragment´s using a
FragmentPagerAdapter`一個FragmentActivity
內部。
這工作正常,我可以頁之間Fragment
s像上面所示。每當將新的Fragment
添加到ViewPager
時,onCreate
方法會觸發並創建新的Loader
。
當我按下手機上的「主頁」按鈕時,應用程序暫停並進入後臺。我總是可以恢復應用程序,它的工作原理很簡單 - 在5/10/20分鐘後在後臺。
...但如果我走了很長一段時間在後臺的應用程序,一個小時或更長時間,在啓動應用程序崩潰和堆棧跟蹤指向下面一行onCreate
方法:
getLoaderManager().initLoader(this.intWeek, savedInstanceState, this);
現在我很失落,爲什麼會發生這種情況。看起來,Android框架在後臺長時間處於非活動狀態後會破壞背景中的某些內容,並且initLoader
方法無法創建Loader
。 documentation about the initLoader
method具體說:
確保加載程序已初始化並處於活動狀態。如果加載程序不存在 ,則會創建一個加載程序(如果活動/分段爲 ,則當前啓動)將啓動加載程序。否則,重新使用最後創建的 加載程序。
任何人都可以指出我在這裏做錯了嗎?這似乎是一個很難調試的問題,因爲我無法隨意複製它。這是非常隨機的。由於
堆棧跟蹤從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
請添加logcat的輸出爲您的運行。 –
@WolframRittmeyer:我已經添加了logcat的相關輸出。這可能是你之後的堆棧跟蹤。 –