2013-02-25 32 views
2

我想避免在Fragment旋轉過程中耗時的數據加載。避免在片段旋轉過程中耗時加載數據

public class WatchlistFragment extends SherlockListFragment { 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     if (savedInstanceState == null) { 
      data = getTimeConsumingData();   
     } else { 
      Log.i(TAG, "savedInstanceState is not null!"); 
      // Avoid performing time consuming data operation during rotation changes. 
      // But I never have chance to reach here !?!? 
      data = savedInstanceState.getStringArray("data"); 
     } 
     setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, data)); 
    } 

    public String[] getTimeConsumingData() { 
     Log.i(TAG, "WatchlistFragment getTimeConsumingData"); 
     return new String[] { "A", "B", "C"}; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     Log.i(TAG, "WatchlistFragment onSaveInstanceState"); 
     super.onSaveInstanceState(outState); 
     outState.putStringArray("data", data); 
    } 

    private String[] data = null; 
    private static final String TAG = WatchlistFragment.class.getSimpleName(); 
} 

奇怪的是,在savedInstanceStateonActivityCreated總是空連我執行幾個旋轉。

請注意,我不喜歡使用setRetainInstance(true)描述Android Fragments Retaining Data作者正在使用onSaveInstanceState。只是我不知道爲什麼我的不工作。

回答

0

只是在你的片段使用setRetainInstance(true)和檢查savedInstanceState==null和不覆蓋onSaveInstanceState

UPDATE

private ArrayAdapter<String> adapter = null; 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setReatainInstance(true); 
    if(adapter==null){ 
     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,getTimeConsumingData()); 
    } 
    setListAdapter(adapter); 
} 
+0

你有完整的代碼示例嗎?當我嘗試將'setRetainInstance'設置爲true時,但每次旋轉時都會創建片段。奇怪的是 – 2013-02-25 11:02:03

+0

。我有'setReatainInstance(true);'in'onActivityCreated'。不工作。將它移動到'onCreate'不起作用。 – 2013-02-25 11:21:53

0

如果您使用的是加載器,請在加載數據後使用loadermanager.destory(loader_id)。它將不會再次加載配置更改。