我正在使用圖像設置爲我所有活動的背景,但它導致內存溢出問題並導致應用程序崩潰。現在,我在我的活動中暫停()和Destroy()上解除綁定,現在它顯示按下後退按鈕上的空白屏幕。那麼如何避免使用額外內存呢?Unbinding drawables onPause()導致無響應的後退導航並跳過此步驟導致內存溢出
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
起初,我在不斷膨脹採用了android我的佈局:背景=「@繪製/」總是造成內存溢出錯誤,指出VM不會讓我們分配10MB現在,我從得到一個位圖(應用程序)。該drawable沒有縮小和綁定它在運行時。現在它說VM不會讓我們分配5MB(應用程序),而不使用unbindDrawables(..) 顯然背景圖像質量顯示已經下降,但我不能瞭解如果我使用的是13KB的png文件,那麼JVM如何處理請求需要5或10MB空間?
我已經將我的佈局語句從onCreate()轉換爲onResume()方法,但應用程序在按下後退按鈕時再次用完內存。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp);
super.onResume();
}
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.home_root));
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
請記住,如果onDestroy()被調用,之前也調用onPause()。 –
僅在'onPause()'解綁定,如@JohnSatriano所述。但仍然,請向我們展示您的onResume函數 –
我沒有覆蓋我的Resume函數。我完全不知道該怎麼做。 – Atinder