La razón androide aprendizaje -11 oom producido y soluciones (pérdidas de memoria manejador)

OOM: https://www.jianshu.com/p/b0451684b4d5
ciclo de vida variable estática: https://blog.csdn.net/ctcwri/article/details/8858414
pérdida de memoria Singleton patrón: HTTPS: // Blog .csdn.net / qq_39830579 / artículo / detalles / 100516883

pérdidas de memoria de controlador:

En África central estática java clases internas y clases internas anónimas están implícitamente en manos de la clase actual de referencias externas , ya Handler clases internas no estáticos para que se mantenga la actividad actual en referencia implícita, si Handler no ha sido puesto en libertad, se mantiene Actividad de referencia externa es también poco probable para ser lanzado, cuando un objeto no requiere una re-uso, que se había recuperado, mientras que un objeto adicional está siendo utilizado por la celebración de su referencia líder que no se puede recuperar, lo que resulta en la presente el objeto no puede ser recuperado y reciclado para permanecer en la memoria de pila, que tenía una pérdida de memoria

solución:

Mantenga la actividad actual con referencias débiles

public class SampleActivity extends Activity {

    /**
     * Instances of static inner classes do not hold an implicit
     * reference to their outer class.
     */
    private static class MyHandler extends Handler {
        private final WeakReference<SampleActivity> mActivity;

        public MyHandler(SampleActivity activity) {
            mActivity = new WeakReference<SampleActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            SampleActivity activity = mActivity.get();
            if (activity != null) {
                // ...
            }
        }
    }

    private final MyHandler mHandler = new MyHandler(this);

    /**
     * Instances of anonymous classes do not hold an implicit
     * reference to their outer class when they are "static".
     */
    private static final Runnable sRunnable = new Runnable() {
        @Override
        public void run() { /* ... */ }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Post a message and delay its execution for 10 minutes.
        mHandler.postDelayed(sRunnable, 1000 * 60 * 10);
    
        // Go back to the previous Activity.
        finish();
    }
}
Publicado 57 artículos originales · ganado elogios 3 · Vistas 6209

Supongo que te gusta

Origin blog.csdn.net/qq_39830579/article/details/100523136
Recomendado
Clasificación