2012-11-27 37 views
4

我已經在Java中靜態對象上搜索了大量谷歌搜索,我想我理解他們在Android中的工作方式。靜態對象在應用程序進程終止時被GC化,而不是當聲明靜態對象的Activity被銷燬時(如果我錯了,請糾正我)。我有一個使用Fragments的Tabhost應用程序。聲明對象的片段就是ViewPager的右邊(有三個片段)。右側的選項卡上有一個顯示用戶數據的ListView,當用戶滑過所有選項卡或遠離應用程序導航時,我希望這些數據能夠保持不變。這些數據不需要保存,只需要通過正常使用應用程序就可以保留在內存中。給我我想要的結果的修復是通過爲我的陣列適配器設置一個靜態前綴。我的問題是,這是否被認爲是良好的做法?我知道不正確地使用靜態對象可能會導致內存問題,但是我沒有得到廣泛使用的任何FC(橫向縱向瀏覽,快速瀏覽標籤,向ListView添加大量數據等)。下面是我使用片段中的靜態數組適配器。好的或不好的做法?

static ArrayAdapter<String> arrayAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 

    View view = inflater.inflate(R.layout.fragment, 
      container, false);  

     if (personList == null) 
     { 

      personList = new ArrayList<String>(); 

     } 


     if (arrayAdapter == null) 
     { 

      arrayAdapter = new ArrayAdapter<String> 
      (getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, personList); 

     } 

編輯代碼:

這是我如何實現這個想法。我有我的主要活動代碼(即父母的標籤片段。我把這個代碼在活動的onDestroy()方法嘗試回收一些內存的一個。

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if (arrayAdapter != null) 
    { 

     arrayAdapter.clear(); 

     arrayAdapter = null; 

     Log.i("Activity", "Adapter nulled!"); 

    } 


    Log.i("Activity", "Activityhas been destroyed"); 
} 

public ArrayAdapter<String> getArrayAdapter(ArrayList<String> personList) 
{ 

    arrayAdapter = new ArrayAdapter<String> 
    (getBaseContext(), android.R.layout.simple_list_item_1, personList); 

    Log.i("Activity", "Adapter Created"); 


    return arrayAdapter; 
} 

有了這個代碼在我的片段

if (personList == null) 
{ 

    personList = new ArrayList<String>(); 

} 


if (arrayAdapter == null) 
{ 

    arrayAdapter = ((ActivityMainScreen)getActivity()).getArrayAdapter(personList); 

} 

回答

12

切記!凡是消費參考您的活動Context並被標記爲STATIC很容易出現內存泄漏。強烈不推薦的。您可以使用某種觀察者/可觀察模式,以保持您的數據可用於其他r類或通過TabHost活動中定義的公共方法簡單訪問所需的對象。

欲瞭解更多信息,請閱讀本http://developer.android.com/training/basics/fragments/communicating.html

關於內存泄漏,也許你應該測試你的低端設備上當前實現,因爲新型號的設備是相當豐富的資源方面。


你的活動:

private ArrayAdapter<String> arrayAdapter = null; 

//initialize your adapter in onCreate 

public ArrayAdapter<String> getListAdapter(){ 
    return arrayAdapter; 
} 

您的片段:

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

    ArrayAdapter<String> adapter = ((YourActivityClass) getActivity()).getListAdapter(); 
    yourListView.setAdapter(adapter); 
} 
+0

感謝您的回答!我正在考慮將數組適配器放在我的Tab主機活動中,因爲那樣它就會有我想要的壽命。我只是不知道如何從Fragment類中獲取該對象。 –

+0

粘貼你的活動和片段代碼,也許我可以幫你... – waqaslam

+0

我想我可能已經想通了。代碼對你來說看起來不錯嗎? –