2013-03-23 57 views
1

我正在使用無查看片段來存儲我的Activity的方向更改期間的一些數據。它看起來大致是這樣的:setRetainInstance(true)不保留片段的成員變量

public class BoardActivity extends BaseActivity { 
    private DataHandler mDataHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // initialize the data handler 
     mDataHandler = (DataHandler)mFragmentManager.findFragmentByTag("data"); 
     if (mDataHandler == null) { 
      mDataHandler = new DataHandler(); 
      mFragmentManager.beginTransaction().add(mDataHandler, "data").commit(); 

      // initialize the data 
      mDataHandler.mThreads = ...; 
     } else { 

      // here, the data is taken and the ListView is filled again. 
      fillView(); 
     } 
    } 

    public static class DataHandler extends Fragment { 
     private Topic[] mThreads; 

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

會發生什麼事是,當活動離開(VOR例如與家庭按鈕),由於某種原因,在後臺根據該活動的重啓被殺,應用程序崩潰。原因是雖然片段管理器找到片段mDataHandler,但其成員變量(mThreads)爲null

片段本身如何保留,但其變量設置爲零?

回答

1

怎樣才能保留片段本身,但其變量設置爲零?

該片段未被保留。保留的片段僅保留配置更改。您沒有通過配置更改。您的流程已終止,因爲Android需要RAM來支持其他應用程序。

+0

我以爲這是不正確的?我的意思是,如果你有5個活動在堆棧中打開,Android從不終止它們來釋放內存。我錯了嗎? – Lefteris 2013-03-23 11:56:14

+1

那麼爲什麼'mDataHandler'不是null當我從FragmentManager獲取它?這正是我檢查的原因。 – janoliver 2013-03-23 12:01:50

+0

@Lefteris:「如果你有5個活動在堆棧中打開,Android永遠不會終止它們來釋放內存,我在這裏錯了嗎?」 - 設備沒有無限的RAM。 Android會*傾向於清除空的進程(例如,所有活動都是'finish()'-ed),但最終將不得不開始終止正在運行活動的進程。 – CommonsWare 2013-03-23 12:24:06