vehiculo total siniestro seguros seguro por plazo perdida para indemnizacion falabella denunciar cotizar como automotriz java android memory-leaks runnable weak-references

java - total - seguros



¿Es esto Runnable seguro de pérdida de memoria? (4)

Soy un principiante total en Java y he creado un simple fragmento de Android de Java donde en Runnable después de 1,5 segundos cambio el TextView de Hello World a Hola Mundo . Funciona perfectamente, básicamente una WeakReference debería evitar que esta pérdida de memoria ocurra, ¿verdad? Tengo una duda si no hay absolutamente ninguna pérdida de memoria cuando ocurre la orientación del dispositivo. Me encantaría comprobar esto, pero no puedo 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 estaban relacionadas con el bloqueo de subprocesos de interfaz de usuario. De hecho, este código ejecuta el controlador en el hilo principal (UI). Para engendrar 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 } } }

El problema ahora es que parece que no puedo retrasar el hilo engendrado de ninguna manera, de lo contrario, funciona.

Esta:

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

hace que la aplicación se abandone a sí misma y no entiendo por qué. Algo me dice que lo estoy retrasando de la manera incorrecta.

EDIT2

Gracias al enlace @EugenMatynov, dame: actualiza ui de otro hilo en Android , entendí por qué la aplicación salió. Todo se reduce a la razón por la que no puede llamar a los métodos de IU desde hilos que no sean el hilo principal. y es una mala práctica actualizar la UI desde otro hilo.


Creo que tu código no tiene fugas si usas:

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 UI para que, si se destruye la actividad, la vista es nula y el ejecutable no dosifique nada.

también debido a la referencia débil, la actividad puede ser basura recolectada porque no hay una referencia fuerte a ella.


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

Podría ser. Por 1.5 segundos Después de que se vacíe la cola, se puede recolectar el recolector de basura y también la actividad anterior. Para anular de forma segura onPause, y llamar a handler.removeCallbacks(null); para borrar la cola del Manejador


Haga esto, de lo contrario, estará bloqueando UIThread y no se recomienda. Para hacer esto, también puede usar un TimerTask, verifíquelo 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