2012-06-25 21 views
1

我有幾個活動,我在this lib幫助下顯示圖像。事情是應用程序內存不足。我試圖gc.clean(),空引用,調用清空imageloader對象,但徒勞。內存泄漏,singleInstance

在MAT中,我發現我有多個相同活動的對象,並且它是默認行爲,如果我沒有弄錯的話。我使用singleInstance來抑制多個實例,並幫助解決了內存泄漏問題。

現在,由於singleInstance,我遇到了導航問題。你認爲我應該繼續使用singleInstance還是嘗試修復多個實例的內存泄漏?

這裏的ImageView的GC根檢驗: enter image description here

UPD:

Bitmap bitmap=null; 
     URL imageUrl = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); 
     conn.setConnectTimeout(30000); 
     conn.setReadTimeout(30000); 
     conn.setInstanceFollowRedirects(true); 
     InputStream is=conn.getInputStream(); 
     OutputStream os = new FileOutputStream(f); 
     Utils.CopyStream(is, os); 
     os.close(); 
     bitmap = decodeFile(f); 
     return bitmap; 

    ImageView imageView = (ImageView) convertView; 
    if(convertView == null){ 
     imageView = new ImageView(_currentActivity); 
    } 

UPD2(導航策略):

我有一個恆定報頭與啓動家庭活動按鈕(帶畫廊)和檔案活動;其次是有一個副標題,其中還包含3個按鈕,這些按鈕指向另外3個帶有列表視圖(由圖像瀏覽+標籤組成)的活動。

這些標題,子標題元素可用於應用程序中的每個活動;鏈接按鈕做什麼,但:

startActivity(new Intent(getActivity(), MainActivity.class)); 

Intent activityIntent = new Intent(getActivity(), SomeActivityWithListViewInside.class); 
// passing some data like list id 
activityIntent.putExtra("list_id", listId); 
startActivity(activityIntent); 

因此,這些活動實例被那些startActivity引起的電話 - 你覺得我應該singleTop或任何其他意圖參數發揮,以避免這個問題 ?

+0

你可以在你的代碼中獲取圖像嗎?你確定你在創建圖像時沒有給出活動上下文嗎?這可能是你的問題。單實例不會產生內存泄漏。 – ania

+0

我傳遞了對適配器中活動的引用。 – user1462299

回答

1

您不應該使用singleInstance launchMode。您需要使用標準和/或singleTop launchMode使您的導航正常工作。如果你發現你的活動有多個實例,但你沒有預料到那樣,那麼你的導航有問題。有多個活動實例會保留所有視圖和圖像,這可能是導致內存不足問題的原因。

更新您的文章與您的預期導航,以及如何管理它,也許我們可以幫助您解決這個問題。

編輯:響應海報的UPD:

我不知道你在哪裏設置_currentActivity,但可能是你的問題。在適配器內創建視圖時,應始終使用適配器的上下文(在創建時設置)。所以,試試這個:

ImageView imageView = (ImageView) convertView; 
if(convertView == null){ 
    imageView = new ImageView(getContext()); 
} 

編輯:響應海報的UPD2:

你需要檢查你的導航,以確保當用戶選擇在你的頭或子報頭中的一個按鈕,你不要活動堆棧中沒有多個活動實例(如果這不是您想要的)。如果您的活動使用大量圖像空間(位圖等),那麼您希望確保您沒有多個實例。您可以重新考慮您的導航,或者您可以使用singleTop,clearTop,reorderToFront等的組合,以便您不會繼續創建活動的實例,而只是將它們重新排列在活動堆棧中以獲得所需的導航行爲。

+0

感謝您的建議 - 我更新了我的問題。請看看它。 – user1462299

3

我強烈建議不要使用活動的怪異標誌。我也總是有導航問題(並且仍然有,即使有片段)使用android API。

相反,我建議你解決內存問題。

你應該看this video約內存泄漏和閱讀this about bitmaps

總之,這裏有一些提示:

  1. 儘量避免靜態引用,特別是如果他們參考上下文。

  2. 儘量避免引用上下文。

  3. 如果您必須引用上下文,請考慮使用ApplicationContext。

  4. 記得在關閉活動時關閉線程和對話框(如果需要的話)。嘗試在不再需要時關閉服務。

  5. 更喜歡靜態內部類超過非靜態內部類(因爲那些引用包含類)。

  6. 請記住,匿名類也具有對包含類的引用。

  7. 要小心你緩存的內容。儘量避免緩存包含對上下文的引用的類,例如視圖和繪圖。

  8. 如果可能,請嘗試使用softReference和/或weakReference引用引用上下文的「危險」對象。

  9. 在android API 10及以下版本中,切記要回收您的位圖。他們通常需要大量的記憶。

  10. 如果活動佔用太多內存,並且您從其中轉到另一活動,請考慮完成並在需要時重新創建它,而不是回到其舊實例。

  11. 如果您使用任何第三方庫或者您正在使用本機代碼(例如使用NDK),請不要忘記在不需要時釋放其內存。達爾維克對你的幫助不大。

0

在創建視圖時將活動作爲上下文傳遞並不好:這可以防止「釋放」活動。您也可以將位圖縮小到您真正需要的大小。

+0

如果視圖是活動的一部分,則需要將活動作爲上下文傳遞,以便在活動被銷燬時視圖也被清除。如果你不這樣做,你會有內存泄漏。 –

+0

正如我所說,幾乎所有這些活動都有列表視圖。我需要通過適配器彈出它們。所以,關於您的答案 - 在適配器的getView中新建ImageView時應該傳遞什麼?應用上下文? – user1462299