圖片資源占用大部分內(nèi)存慎王,當(dāng)圖片不再使用時(shí),如何回收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();
}
}
}
咱旱、、绷耍、
心里疑問吐限,這樣真的能回收嗎?于是做了一個(gè)小實(shí)驗(yàn)
(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();
}
}
}
}
開始試驗(yàn)
(1)自動(dòng)觸發(fā)gc——as 點(diǎn)擊小車子的按鈕可以觸發(fā)gc
(2)沒有圖片資源如下圖:
沒有圖片資源要消耗2.27MB內(nèi)存
(3)有圖片資源如下圖
有圖片資源要消耗12.72MB內(nèi)存
(4)點(diǎn)擊回收按鈕觸發(fā)
releaseImageViewResouce(ImageView imageView)方法回收圖片資源褂始,并且觸發(fā)gc诸典,雖然消耗內(nèi)存變小了一點(diǎn),但是還是消耗12.58MB崎苗。說明圖片資源沒有被回收
那怎么才能回收圖片資源呢狐粱??胆数?脑奠??幅慌??轰豆?忽然靈光一現(xiàn)胰伍,如果把imageview從父容器中移除能不能到達(dá)回收圖片資源呢!酸休!
releaseImageViewResouce()方法改動(dòng)如下:
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;
}
}
}
立即運(yùn)行代碼,并且觸發(fā)gc斑司,結(jié)果喜聞樂見渗饮,圖片資源被回收了。結(jié)果如下圖:
最后總結(jié)下:要想手動(dòng)回收imageView圖片資源,應(yīng)該在代碼中new ImageView并添加到父容器中互站。當(dāng)要回收ImageView圖片資源時(shí)調(diào)用releaseImageViewResouce()方法并將imageView從父容器移除私蕾,并將imag置為null。這樣就能回收圖片資源了:摇2劝取!