찾다

 >  Q&A  >  본문

Android中Bitmap回收问题

使用Bitmap的静态方法createScaledBitmap来创建一个符合规格的Bitmap的时候,原生的bitmap是否需要回收?

代码如下:

private void initDragBitmap() {
    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mingren);
    mDragBitmap = Bitmap.createScaledBitmap(srcBitmap, FLOAT_BALL_WIDTH, FLOAT_BALL_HEIGHT, true);
    srcBitmap.recycle();
}

代码中srcBitmap是否需要回收?


补充问题:

看了大家的回复,基本可以确定如果srcBitmap后续不再使用了,确实是可以手动recycle的,同时它本身也是个局部变量,是可以等待系统GC的。

那新问题来了(或者说我最初想问的问题来了),当createScaledBitmap方法中传入的宽和高跟srcBitmap相同时,通过createScaledBitmap代码注释可以看出它是将srcBitmap返回了,这个时候我强行recycle了srcBitmap,会不会导致mDragBitmap也为null?

源码注释:

    /**
     * Creates a new bitmap, scaled from an existing bitmap, when possible. If the
     * specified width and height are the same as the current width and height of
     * the source bitmap, the source bitmap is returned and no new bitmap is
     * created.
     *
     * @param src       The source bitmap.
     * @param dstWidth  The new bitmap's desired width.
     * @param dstHeight The new bitmap's desired height.
     * @param filter    true if the source should be filtered.
     * @return The new scaled bitmap or the source bitmap if no scaling is required.
     * @throws IllegalArgumentException if width is <= 0, or height is <= 0
     */
    public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight,
            boolean filter) {
            }
阿神阿神2772일 전557

모든 응답(5)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-17 17:37:07

    GC가 재활용될 때까지 기다릴 수 있습니다. 물론, 평소처럼 수동으로 재활용하는 것도 좋은 습관입니다.

    정답:

    예, 두 참조가 동일한 개체인 경우 재활용을 사용하면 개체의 이미지가 정리됩니다. 그러나 정리되는 것은 객체 자체가 아닌 객체에 있는 이미지 데이터이므로 mDragBitmap은 null이 아니지만 mDragBitmap에서 이미지 데이터를 사용할 때 오류가 보고됩니다.

    여기에서 판단한 후 재활용할 수 있습니다.

    으아악

    회신하다
    0
  • PHPz

    PHPz2017-04-17 17:37:07

    추가 작업이 없을 것이라고 확신하는 경우 recycler 메서드를 호출하여 메모리를 해제할 수 있습니다. getPixels()setPixels()에 대한 후속 호출이 있는 경우 메모리를 임의로 해제하지 마세요. GC 재활용을 기다리세요. 그렇지 않으면 예외가 발생합니다.

    회신하다
    0
  • PHPz

    PHPz2017-04-17 17:37:07

    비공개 무효 initDragBitmap() {

    으아악

    }

    위 코드와 관련하여 질문이 있습니다. srcBitmap=null을 사용하여 gc에서 최대한 빨리 재활용할 수 있습니까?

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 17:37:07

    으아악

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 17:37:07

    현재 메인스트림 버전에서는 GoogleBitmap의 메모리를 힙에 넣었고, 재활용도 gc에 넘겨졌기 때문에 포스터에서는 이 문제를 고려할 필요가 없습니다. 메모리가 부족할 경우 자동으로 재활용됩니다.

    회신하다
    0
  • 취소회신하다