0

我有一個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方法無法創建Loaderdocumentation 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 
+0

請添加logcat的輸出爲您的運行。 –

+0

@WolframRittmeyer:我已經添加了logcat的相關輸出。這可能是你之後的堆棧跟蹤。 –

回答

1

我跑進與裝載機類似的問題。我發現碎片/加載程序的生命週期很複雜。我很想找到一份詳細解釋它的文檔。

無論如何,我所做的解決此問題的方法是將initLoader()調用移至onActivityCreated()方法。試試看。

0

嘗試使用這樣的:

boolean canFire = ((loader != null) && !loader.isReset()); 
      // restart or initialise loader 
      if (canFire) { 
       getLoaderManager().restartLoader(loaderId, args, this); 
      } else { 
       getLoaderManager().initLoader(loaderId, args, this); 
      } 
相關問題