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();
}
}