使用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) {
}
Vous pouvez attendre que le GC recycle. Bien sûr, c'est une bonne habitude de recycler manuellement comme vous le faites.
Réponse :
Oui, si les deux références sont le même objet, alors lorsque vous utilisez le recyclage, les images de l'objet seront nettoyées. Cependant, ce qui est nettoyé, ce sont les données d'image dans l'objet, pas l'objet lui-même, donc mDragBitmap ne sera pas nul, mais une erreur sera signalée lors de l'utilisation des données d'image dans mDragBitmap.
Vous pouvez porter un jugement ici puis recycler :
Si vous êtes sûr qu'il n'y aura pas d'autres opérations, vous pouvez appeler sa méthode
recycler
pour libérer la mémoire ; s'il y a des appels ultérieurs àgetPixels()
etsetPixels()
, ne libérez pas la mémoire à volonté et attendez le recyclage du GC, sinon une exception sera levée.vide privé initDragBitmap() {
}
Concernant le code ci-dessus, j'aimerais discuter d'une question avec vous. Est-il possible d'utiliser srcBitmap=null pour laisser gc le recycler le plus rapidement possible ?
Avec la version grand public actuelle,
Google
a mis la mémoire deBitmap
dans le tas, et le recyclage a également été confié àgc
, l'affiche n'a donc pas besoin de considérer cette question. Lorsque la mémoire n'est pas suffisante, elle est automatiquement recyclée.