Sto usando un'immagine da impostare come sfondo per tutte le mie attività ma causava un problema di overflow di memoria e bloccava l'app. Ora sto disancorando i miei drawable su pause() e su Destroy() nella mia attività e ora mostra lo schermo vuoto premendo il pulsante indietro. Quindi, come posso evitarlo senza usare memoria extra.Disattivare i drawable onPause() causando una mancata risposta alla navigazione indietro e saltare questo passaggio causano un overflow di memoria
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();
}
Inizialmente ero gonfiare il mio layout utilizzando Android: background = "@ drawable /", che sempre causato l'errore di overflow di memoria dicendo che VM non ci permetterà di allocare 10 MB Ora sto ottenendo una bitmap da (app.) quel drawable senza ridimensionarlo e legarlo in runtime. Ora dice che VM non ci permetterà di allocare 5MB (app) senza usare unbindDrawables (..) Ovviamente la qualità dell'immagine di sfondo che viene mostrata è diminuita ma non sono in grado per capire che se sto usando un file PNG di 13 KB, come fa JVM a richiedere 5 o 10 MB di spazio per elaborare la richiesta?
Ho spostato le mie istruzioni di layout da onCreate() al metodo onResume() ma l'applicazione ha di nuovo esaurito la memoria premendo il pulsante Indietro.
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();
}
}
Ricordare che se onDestroy() viene chiamato, onPause() viene chiamato anche in precedenza. –
unbind solo in 'onPause()' come dichiarato da @JohnSatriano. Ma ancora, mostraci la tua funzione onResume –
Non ho eseguito l'override sulla mia funzione di ripresa. Non ho assolutamente idea di cosa fare lì. – Atinder