单一方法的内存泄漏

时间:2013-08-12 03:05:26

标签: java android memory-leaks heap

这整个内存泄漏对我来说似乎很复杂。这里有很多很棒的信息,但我不太明白。即使在阅读Creating a memory leak with Java之后,我仍然迷失了!有人可以向我指出这段代码中的内存泄漏在哪里,好吗? (当这个方法重复运行时会发生这种情况。)非常感谢你!

08-11 23:02:07.487: I/ViewRootImpl(969): Reporting drop result: true
08-11 23:02:07.987: D/dalvikvm(969): GC_FOR_ALLOC freed 1769K, 18% free 10101K/12180K, paused 13ms, total 13ms
08-11 23:02:08.057: D/dalvikvm(969): GC_CONCURRENT freed 4K, 11% free 10915K/12180K, paused 3ms+5ms, total 30ms
08-11 23:02:08.057: D/dalvikvm(969): WAIT_FOR_CONCURRENT_GC blocked 1ms
08-11 23:02:14.757: I/dalvikvm(969): threadid=3: reacting to signal 3
08-11 23:02:14.767: I/dalvikvm(969): Wrote stack traces to '/data/anr/traces.txt'

public void deal(View v) {

    // call and play
    if (dealt) {

        if (anteBet == playBet) {
            // hand plays
            dealt = false;
            deal.setImageResource(R.drawable.deal);
            fold.setImageResource(R.drawable.clear);
            dealersCards.clear();
            dealersCards.add(d1);
            dealersCards.add(d2);
            dealersCards.add(d3);
            displayCards(dealersCards);

            if (getHand(pc1, pc2, pc3) > getHand(dc1, dc2, dc3)
                    && getHand(dc1, dc2, dc3) >= 1120000) {
                award = true;
                ante(anteBet);
                award = true;
                play(playBet);
            } else if (getHand(dc1, dc2, dc3) < 1120000) {
                award = true;
                ante(anteBet);
            }

            else {
                if (!(getHand(pc1, pc2, pc3) == getHand(dc1, dc2, dc3))) {

                    award = true;
                    ante(-anteBet);
                    award = true;
                    play(-playBet);
                }
            }
            antePlusPayout();
            pairPlusPayout();

        } else {
            play(anteBet - playBet);
        }

        // deal cards
    } else if (anteBet > 0) {
        deal.setImageResource(R.drawable.call);
        fold.setImageResource(R.drawable.fold);
        displayCards(display);
        d1.setImageResource(R.drawable.facedown);
        d2.setImageResource(R.drawable.facedown);
        d3.setImageResource(R.drawable.facedown);
        dealt = true;
        deal.setImageResource(R.drawable.call);
    }
}

public void displayCards(List<ImageView> disp) {
    int cardNumber = 0;
    for (ImageView c : disp) {


        cardNumber++;

        Card tempCard;

        do {
            tempCard = deck.get(rand(52));
        } while (cardsInPlay.contains(tempCard));

        cardsInPlay.add(tempCard);
        rank = tempCard.getRank();
        suit = tempCard.getSuit();

        if (cardNumber == 1) {
            dc1 = tempCard;
        } else if (cardNumber == 2) {
            dc2 = tempCard;
        } else if (cardNumber == 3) {
            dc3 = tempCard;
        } else if (cardNumber == 4) {
            pc1 = tempCard;
        } else if (cardNumber == 5) {
            pc2 = tempCard;
        } else {
            pc3 = tempCard;
        }

        if (rank == 2 && suit == 'c') {
            c.setImageResource(R.drawable.clubs2);
        } else if (rank == 3 && suit == 'c') {
            c.setImageResource(R.drawable.clubs3);
        } else if (rank == 4 && suit == 'c') {
            c.setImageResource(R.drawable.clubs4);
        } else if (rank == 5 && suit == 'c') {
            c.setImageResource(R.drawable.clubs5);
        } else if (rank == 6 && suit == 'c') {
            c.setImageResource(R.drawable.clubs6);
        } else if (rank == 7 && suit == 'c') {
            c.setImageResource(R.drawable.clubs7);
        } else if (rank == 8 && suit == 'c') {
            c.setImageResource(R.drawable.clubs8);
        } else if (rank == 9 && suit == 'c') {
            c.setImageResource(R.drawable.clubs9);
        } else if (rank == 10 && suit == 'c') {
            c.setImageResource(R.drawable.clubs10);
        } else if (rank == 11 && suit == 'c') {
            c.setImageResource(R.drawable.clubsj);
        } else if (rank == 12 && suit == 'c') {
            c.setImageResource(R.drawable.clubsq);
        } else if (rank == 13 && suit == 'c') {
            c.setImageResource(R.drawable.clubsk);
        } else if (rank == 14 && suit == 'c') {
            c.setImageResource(R.drawable.clubsa);
        }

        else if (rank == 2 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds2);
        } else if (rank == 3 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds3);
        } else if (rank == 4 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds4);
        } else if (rank == 5 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds5);
        } else if (rank == 6 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds6);
        } else if (rank == 7 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds7);
        } else if (rank == 8 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds8);
        } else if (rank == 9 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds9);
        } else if (rank == 10 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds10);
        } else if (rank == 11 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsj);
        } else if (rank == 12 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsq);
        } else if (rank == 13 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsk);
        } else if (rank == 14 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsa);
        }

        else if (rank == 2 && suit == 'h') {
            c.setImageResource(R.drawable.hearts2);
        } else if (rank == 3 && suit == 'h') {
            c.setImageResource(R.drawable.hearts3);
        } else if (rank == 4 && suit == 'h') {
            c.setImageResource(R.drawable.hearts4);
        } else if (rank == 5 && suit == 'h') {
            c.setImageResource(R.drawable.hearts5);
        } else if (rank == 6 && suit == 'h') {
            c.setImageResource(R.drawable.hearts6);
        } else if (rank == 7 && suit == 'h') {
            c.setImageResource(R.drawable.hearts7);
        } else if (rank == 8 && suit == 'h') {
            c.setImageResource(R.drawable.hearts8);
        } else if (rank == 9 && suit == 'h') {
            c.setImageResource(R.drawable.hearts9);
        } else if (rank == 10 && suit == 'h') {
            c.setImageResource(R.drawable.hearts10);
        } else if (rank == 11 && suit == 'h') {
            c.setImageResource(R.drawable.heartsj);
        } else if (rank == 12 && suit == 'h') {
            c.setImageResource(R.drawable.heartsq);
        } else if (rank == 13 && suit == 'h') {
            c.setImageResource(R.drawable.heartsk);
        } else if (rank == 14 && suit == 'h') {
            c.setImageResource(R.drawable.heartsa);
        }

        else if (rank == 2 && suit == 's') {
            c.setImageResource(R.drawable.spades2);
        } else if (rank == 3 && suit == 's') {
            c.setImageResource(R.drawable.spades3);
        } else if (rank == 4 && suit == 's') {
            c.setImageResource(R.drawable.spades4);
        } else if (rank == 5 && suit == 's') {
            c.setImageResource(R.drawable.spades5);
        } else if (rank == 6 && suit == 's') {
            c.setImageResource(R.drawable.spades6);
        } else if (rank == 7 && suit == 's') {
            c.setImageResource(R.drawable.spades7);
        } else if (rank == 8 && suit == 's') {
            c.setImageResource(R.drawable.spades8);
        } else if (rank == 9 && suit == 's') {
            c.setImageResource(R.drawable.spades9);
        } else if (rank == 10 && suit == 's') {
            c.setImageResource(R.drawable.spades10);
        } else if (rank == 11 && suit == 's') {
            c.setImageResource(R.drawable.spadesj);
        } else if (rank == 12 && suit == 's') {
            c.setImageResource(R.drawable.spadesq);
        } else if (rank == 13 && suit == 's') {
            c.setImageResource(R.drawable.spadesk);
        } else if (rank == 14 && suit == 's') {
            c.setImageResource(R.drawable.spadesa);
        }


    }
}

2 个答案:

答案 0 :(得分:1)

在java中,内存使用过多的常见原因是在某种循环中(例如游戏循环)分配而不是销毁对象。您是否在循环中添加动态数组/排序列表?此外,如果方法需要一段时间,则在销毁之前,局部变量可能会发生这种影响。

答案 1 :(得分:0)

如果您经常更改图片,则需要使用ImageView执行此操作

  

Drawable obj = imgView.getDrawable();

if( obj instanceof BitmapDrawable)
{
    Bitmap bmp = obj.getBitmap();
    bmp.Recycle();
} 

在此语句之前调用cleanupcode函数

Bitmap CleanupCode(ImageView imgView) {

Drawable obj = imgView.getDrawable(); 

if( obj instanceof BitmapDrawable) {

 Bitmap bmp = obj.getBitmap(); bmp.Recycle(); return bmp;
 }
 return null; 
} 
////

Bitmap bmp = CleanupCode(c); 

c.setImageResource(R.drawable.clubs3); 
if(null != bmp) {
bmp.Recycle(); 
bmp = null; 
} 
相关问题