2012-12-13 72 views
0

我收到內存不足錯誤。我檢查了DDMS,發現我分配更多內存的地方在我的適配器中的getView()方法中。它是一個更好的辦法,我創建的對象則是這樣的:使用適配器的內存不足

view=new ImageView(myContext); 

這是我getView的一個例子()方法:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView==null){ 
     view=new ImageView(myContext); 
     view.setLayoutParams(new AbsListView.LayoutParams(columnWidth,columnWidth)); 
     view.setBackgroundColor(Color.GRAY); 
    }else{ 
     view=convertView; 
     convertView.setBackgroundColor(Color.GRAY); 
    } 
    return view; 
} 

我得到的c'tor背景:

public emptySquaresAdapter(Context myContext,) { 
    super(); 
    this.myContext=myContext; 
} 

我看了關於上下文泄漏,是這樣嗎?

編輯:

在這種情況下,我在顯示屏幕上的所有視圖中的一次,所以轉換後的觀點是從來沒有使用過(我不需要滾動顯示更多的意見)。

此適配器在屏幕上顯示12個方格。方法getView被稱爲12次與位置0(我想測量所有的孩子的爭奪),然後只能繼續位置1,2,3 ... 爲什麼這樣的事情發生?這是否會造成OOM問題? 我從另一個適配器調用這個適配器,我想這會讓一切變得複雜。

我也解除綁定所有可繪製在的onDestroy,並設置imageView.getDrawable()。setCallback(空)的所有imageViewsIt仍然不起作用

+0

當他們不再需要時,您更可能不會刪除ImageView,因此他們只是保持堆疊。 – DeeV

+1

放入一些日誌,看看convertView是否正常工作。 – FoamyGuy

+0

不可能知道您發佈的代碼。請發佈重現問題的最低代碼。 – m0skit0

回答

2

您發佈的代碼是可以的。問題可能在其他地方。

P.S.爲什麼你要存儲上下文對象?你可以通過調用parent.getContext()在你的getView()方法中隨時獲得它。

根據我的經驗,只要你不拘泥於什麼類型的上下文並不重要(你在做什麼)。

但是,如果你的適配器本身沒有存儲在某個地方,並且只是一個活動的一部分,它應該沒問題,因爲適配器只會獲得活動的成果。

+0

謝謝,我反對使用parent .getContext()! – user1787773

+0

問題是我正在使用圖庫小部件(小細節:-),它不回收它的視圖。謝謝! – user1787773

0

你從來沒有在第一時間指派convertView。所以,每次getView()時間是叫你創建一個新的ImageView

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView==null){ 
     convertView=new ImageView(myContext); 
     convertView.setLayoutParams(new AbsListView.LayoutParams(columnWidth,columnWidth)); 
     convertView.setBackgroundColor(Color.GRAY); 
    }else{ 

     convertView.setBackgroundColor(Color.GRAY); 
    } 
    return convertView; 
} 
1

你應該確保你通過Application上下文(getApplicationContext())不活動場景(this爲EG),因爲使用Activity背景下可能會導致內存因爲它們綁定的對象(實現中的view)不會被垃圾收集,導致內存泄漏和OutOfMemory異常。

您應該避免的另一件事是每次調用getView()時都會創建一個新的ViewconvertView是用作滾動後出現的行的新的View的再循環視圖(滾動時將被刪除的視圖)。使用它,而不是每次調用都創建view對象(如果GC收集它,它不會導致Outofmemory異常,但可能會在GC運行時導致滾動緩慢)。

+0

我可以從沒有上下文的適配器調用getApplicationContext()嗎?我同意轉換後的視圖,但在這種情況下,所有視圖都立即顯示在屏幕上,不需要滾動 – user1787773

+0

這是您傳遞給構造函數的關注點。如果你用'emptySquaresAdapter(getApplicationContext())'而不是'emptySquaresAdapter(this)'創建適配器,那麼你就不應該有我說的內存泄漏。每行都會調用getView(),所以你爲每行都創建了一個ImageView,如果你有Activity的上下文泄漏,將不會是GC –