2014-10-06 69 views
0

在閱讀安卓手冊時得到了以下示例。有人可以向我確認爲什麼在這個例子中總是創建適配器嗎?不應該只在model == null的情況下才能完成嗎? 如果我理解正確,所有數據成員都被保留(在這個例子中),所以ListView將被保留,以及它的配置好的ListAdapter和其他一切。setRetainInstance with Fragment

public class AsyncDemoFragment extends SherlockListFragment { 
    private static final String[] items = { "lorem", "ipsum", "dolor" }; 

    private ArrayList<String> model = null; 
    private ArrayAdapter<String> adapter = null; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setRetainInstance(true); 

     if (model == null) { 
      model = new ArrayList<String>(); 

      new AddStringTask().execute(); 
     } 

     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, model); 
     setListAdapter(adapter); 
    } 

    class AddStringTask extends AsyncTask<Void, String, Void> { 

     // … 

     protected void onProgressUpdate(String... item) { 
      adapter.add(item[0]); 
     } 
    } 
} 

回答

3

的情況下您Fragment將被保留 - 但是,由Fragment創建的View仍然會被破壞並重新創建,除非特別保留(這可以很容易導致內存泄漏)。基本上,沒有setRetainInstance(),以下事件(與他人一起)會發生上的配置變化:

// Fragment initialized 
onCreate() 
onCreateView() 

// Configuration change 
onDestroyView() 
onDestroy() 
onCreate() 
onCreateView() 

隨着setRetainInstance(true)

// Fragment initialized 
onCreate() 
onCreateView() 

// Configuration change 
onDestroyView() 
onCreateView() 

從本質上講,你仍然需要重新創建View,但其他任何實例字段不會被重置。

您應該仍然能夠處理的情況下,他們復位,但是,由於即使setRetainInstance(true)Activity可以在後臺因內存壓力被殺死。

+0

感謝您的回覆。但只是爲了澄清。帶有setRetainInstance的片段(true)會將其視圖對象的所有視圖都銷燬嗎?如果是 - 那麼適配器實例仍將保留。正確?所以,如果存在(如果(model == null)),則不必再次創建。沒有? – Leon 2014-10-06 21:33:30

+0

如果(模型== null)在模塊內部放置adapter = new ArrayAdapter不是更好,所以它不會在它存在的情況下創建新實例... – Leon 2014-10-06 21:41:00

+0

正確,您應該明確釋放所有視圖在onDestroyView()中引用以避免泄漏活動引用。實際上,我會在'onDestroyView()'中明確地將適配器引用無效(因爲適配器持有對正在銷燬的Activity實例的強引用,以便對項目視圖進行充氣)。保持模型,但重新創建視圖時重新創建適配器。 – kcoppock 2014-10-06 22:00:20

相關問題