¿Es esta Runnable a salvo de fugas de memoria?

Soy un principiante total en Java y he creado un simple fragmento Android de Java donde en un Runnable después de 1,5 segundos cambio el TextView de Hello World a Hola Mundo . Funciona perfectamente, básicamente una WeakReference debe evitar esta fuga de memoria que suceda a la derecha? Tengo una duda si absolutamente no hay pérdida de memoria siempre que ocurre la orientación del dispositivo. Me encantaría comprobar esto, pero no puedo manejar cambiar la orientación en mi Android emulado.

Este es el código:

 package com.example.helloworld; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.util.Log; import java.lang.ref.WeakReference; public class HelloWorldActivity extends Activity { private Handler h = new Handler(); private static TextView txtview; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtview = (TextView) findViewById(R.id.mainview); h.postDelayed(new WeakRunnable(txtview),1500); } private static final class WeakRunnable implements Runnable { private final WeakReference<TextView> mtextview; protected WeakRunnable(TextView textview){ mtextview = new WeakReference<TextView>(textview); } @Override public void run() { TextView textview = mtextview.get(); if (textview != null) { txtview.setText("Hola Mundo"); textview = null; // No idea if setting to null afterwards is a good idea } Log.d("com.example.helloworld", "" + textview); } } } 

EDITAR

Está a salvo de fugas de memoria pero algunas respuestas también se referían a bloqueo de subprocesos de interfaz de usuario. De hecho, este código ejecuta el controlador en el subproceso principal (UI). Para generar un nuevo hilo, estoy generando un hilo manualmente de la siguiente manera:

 package com.example.helloworld; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.util.Log; import java.lang.ref.WeakReference; public class HelloWorldActivity extends Activity { private static TextView txtview; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtview = (TextView) findViewById(R.id.mainview); Thread t = new Thread(new WeakRunnable(txtview)); t.start(); } private static final class WeakRunnable implements Runnable { private final WeakReference<TextView> mtextview; protected WeakRunnable(TextView textview){ mtextview = new WeakReference<TextView>(textview); } @Override public void run() { TextView textview = mtextview.get(); if (textview != null) { /* try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } */ txtview.setText("Hola Mundo"); textview = null; } Log.d("com.example.helloworld", "" + Thread.currentThread().getName()); // Outputs "Thread-<num>" if not running on UI thread } } } 

La cuestión ahora es que no puedo parecerse a retrasar el hilo generado de ninguna manera, de lo contrario funciona.

Esta:

 try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } 

Hace que la aplicación se cierre y no entiendo por qué. Algo me dice que estoy retrasando el camino equivocado.

EDIT2

Gracias al enlace @EugenMatynov darme: actualización ui de otro hilo en android He entendido por qué la app dejó. Todo se reduce a la razón Usted no puede llamar a los métodos de interfaz de usuario de hilos que no sean el hilo principal. Y es mala práctica actualizar la interfaz de usuario desde otro subproceso.

4 Solutions collect form web for “¿Es esta Runnable a salvo de fugas de memoria?”

Creo que su código es libre de fugas si utiliza:

 private static Handler h = new Handler(); 

o

 txtview.postDelayed(new WeakRunnable(txtview),1500); 

Porque ha almacenado la vista como una WeakReference. el método:

 txtview.postDelayed(new WeakRunnable(txtview),1500); 

Simplemente llame al manejador principal del subproceso de la interfaz de usuario, por lo que si la actividad se destruye, la vista es nula y la dosis no se puede ejecutar.

También debido a la debilidad de la actividad se puede recolectar basura porque no hay una fuerte referencia a ella.

Tengo una duda si absolutamente no hay pérdida de memoria siempre que ocurre la orientación del dispositivo.

Podría ser. Durante 1,5 segundos. Después de que se vacíe la cola, el manejador puede ser recolectado de basura, y también la antigua Actividad. Para ser seguro sobreescribir onPause, y call handler.removeCallbacks(null); Borrar la cola del manejador

H.postDelayed (nuevo WeakRunnable (txtview), 1500); Creo que va a estar bloqueando UI Thread. Aquí hay una buena muestra para fugas de memoria. https://github.com/badoo/android-weak-handler

Haga esto, de lo contrario bloqueará UIThread y no se recomienda. Para hacer esto, también puede usar un TimerTask, compruébelo aquí: http://developer.android.com/reference/java/util/TimerTask.html

 import android.widget.TextView; import android.util.Log; import java.lang.ref.WeakReference; public class HelloWorldActivity extends Activity { private Handler h = new Handler(); private static TextView txtview; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtview = (TextView) findViewById(R.id.mainview); h.postDelayed(new Runnable() { @Override public void run() { changeText(); } }, 1500); } public void changeText(){ txtview.setText("Hola mundo."); h.removeCallbacksAndMessages(null); } } 

Por cierto, puedes cambiar la orientación en tu emulador de esta manera: Ctrl + F12

  • RemoveCallbacks no se detiene runnable
  • El hilo no interrumpe
  • Actualización de la interfaz de usuario desde un servicio (mediante un controlador?)
  • Tomando un cómputo pesado del subproceso de la interfaz de usuario de Android
  • ¿Existe ya una clase StopWatch para android y por qué no funciona mi implementación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.