簡體   English   中英

Android / Java對象不是垃圾回收

[英]Android/Java object not garbage collected

我正在開發一個簡單的pdf閱讀器來重寫現有的例子。 我的應用程序有一個自定義視圖,下一個和上一個按鈕。 單擊下一個按鈕時,它會從Internet下載pdf並在視圖中顯示。 每次單擊下一個或上一個按鈕時,都會調用以下showPdf()方法。

public void showPdf(){

    RelativeLayout lout = (RelativeLayout)LayoutInflater.from(this).inflate(R.layout.main, null);
setContentView( lout );
m_vPDF = null;
m_vPDF = (PDFReader)lout.findViewById(R.id.PDFView);

m_vPDF.open( m_doc);


m_vPDF.setViewListener(m_vPDF);

LinearLayout bar_find = (LinearLayout)lout.findViewById(R.id.bar_find);
     //
btn_prev = (Button)bar_find.findViewById(R.id.btn_prev);
btn_next = (Button)bar_find.findViewById(R.id.btn_next);
//        
btn_prev.setOnClickListener(this);
btn_next.setOnClickListener(this);
}

PDFReader是具有顯示PDF的查看器的對象。 以下是PDFReader代碼的一部分。

public class PDFReader extends View implements PDFView.PDFViewListener,  

    ThumbView.ThumbListener
{

private PDFView m_viewer = null;

public PDFReader(Context context)
{
    super(context);
}
public PDFReader(Context context, AttributeSet attrs)
{
    super(context, attrs);
}
public void set_viewer( int view_style )
{

    switch( view_style )
    {
    case 1:
        m_viewer = new PDFViewHorz();
        break;
    case 2:
        m_viewer = new PDFViewScroll();
        break;
    case 3:
        m_viewer = new PDFViewSingle();
        break;
    case 4:
        m_viewer = new PDFViewSingleEx();
        break;
    case 5:
        m_viewer = new PDFViewReflow();
        break;
    default:
        m_viewer = new PDFViewVert();
        break;
    }
    if( m_viewer != null )
    {
        if( doc != null ) m_viewer.viewOpen(getContext(), doc, 0xFFCC0000, 4);
        m_viewer.viewSetAnnotListener( annot_listener );
        m_viewer.viewSetViewListener( view_listener );
        m_viewer.viewResize(getWidth(), getHeight());
        if( pos != null ) m_viewer.viewGoto(pos);
    }
}

在我的showPdf中,每次單擊按鈕時都會初始化PDFReader,而在PDFReader中,PDFView的實例會使用PDFViewVert對象進行初始化,即使將PDFReader設置為null並將PDFView設置為null,也不會進行垃圾回收。 結果它導致了內存錯誤。

這是轉儲的內存分析,顯示已創建了14個PDFViewVert實例,但從未取消分配。

14 instances of "com.radaee.pdfex.PDFViewVert$1", loaded by "dalvik.system.PathClassLoader @ 0x412a0b08" occupy 19,602,792 (64.39%) bytes.

Biggest instances:

com.radaee.pdfex.PDFViewVert$1 @ 0x412a1ae8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412c7c30 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x418bdf78 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41a382f8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41a4df50 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41eaf1c0 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x4202a8e0 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x421aaa10 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x4233dbf8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412a0bf0 - 1,543,024 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412bbf58 - 1,390,792 (4.57%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412f0790 - 1,390,792 (4.57%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x424c4b50 - 1,390,792 (4.57%) bytes.


Keywords
com.radaee.pdfex.PDFViewVert$1
dalvik.system.PathClassLoader @ 0x412a0b08

任何幫助表示贊賞..謝謝,

Java GC不一定清除不再引用的對象。 如果到目前為止有足夠的內存,它可以決定不對它們做任何事情。

只能通過內存分析器對潛在的內存泄漏進行真正的檢查。

但你可以嘗試更容易檢查。 嘗試減少應用程序的堆大小並調用System.gc() 這並不能保證觸發GC,但是如果它開始刪除你的對象,那么這可能是你沒有內存泄漏的好跡象。

試試這個:

Runtime.getRuntime().gc();

改變這個

m_vPDF = null;

至,

if (m_vPDF != null){
  m_vPDF.recycle();
  m_vPDF = null;
}

這將幫助您清理未使用的對象。

希望它能幫到你。

謝謝。

就個人而言,我認為您最好的選擇是使用自定義適配器,這樣它將重用視圖,並且您不會獲得pdfview的23個實例。 它只會保存一個,它會讓你能夠滑動而不是擊中下一個或上一個。 不幸的是,這些設備由於你得到的東西而沒有很多記憶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM