图片资源占用大部分内存,当图片不再使用时,如何回收ImageView的图片资源呢?
百度下,找到的大部分解决办法如下:
、、、
public void releaseImageViewResouce(ImageView imageView)
{ if (imageView == null)
return;
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
}
}
、、、
心里疑问,这样真的能回收吗?于是做了一个小实验
(1)布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<Button
android:id="@+id/btn"
android:layout_width="150dp"
android:layout_height="50dp"
android:text="回收"
android:textColor="#454544"
android:textSize="25sp"
/>
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
(2)代码如下:
public class MainActivity extends AppCompatActivity
{
private LinearLayout mLl;
private Button btn;
private ImageView imageView;
@Override
protected void onCreate(BundlsavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLl = (LinearLayout) findViewById(R.id.activity_main);
btn = (Button) findViewById(R.id.btn);
imageView = (ImageView) findViewById(R.id.img); imageView.setImageResource(R.drawable.img);
btn.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
releaseImageViewResouce(imageView);
}
});
}
public void releaseImageViewResouce(ImageView imageView)
{
if (imageView == null)
return;
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
}
}
}
开始试验
(1)自动触发gc——as 点击小车子的按钮可以触发gc
(2)没有图片资源如下图:
没有图片资源要消耗2.27MB内存
(3)有图片资源如下图
有图片资源要消耗12.72MB内存
(4)点击回收按钮触发
releaseImageViewResouce(ImageView imageView)方法回收图片资源,并且触发gc,虽然消耗内存变小了一点,但是还是消耗12.58MB。说明图片资源没有被回收
那怎么才能回收图片资源呢????????忽然灵光一现,如果把imageview从父容器中移除能不能到达回收图片资源呢!!
releaseImageViewResouce()方法改动如下:
public void releaseImageViewResouce()
{
if (imageView == null) return;
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
//将imageView从父容器移除,并将imag置为null
if(mLl!=null&&imageView!=null)
{
mLl.removeView(imageView);
imageView=null;
}
}
}
立即运行代码,并且触发gc,结果喜闻乐见,图片资源被回收了。结果如下图:
最后总结下:要想手动回收imageView图片资源,应该在代码中new ImageView并添加到父容器中。当要回收ImageView图片资源时调用releaseImageViewResouce()方法并将imageView从父容器移除,并将imag置为null。这样就能回收图片资源了!!!