рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ:
рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг ред рдЬреЛ рдХреЛрдИ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрдЯ рдХреЗ рддрд╣рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ рдЪрд▓рд┐рдП рдЬрд╛рдиреЗ ...
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдореГрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
рдХрд┐рд╕реА рднреА рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдПрдХ рдЕрдиреБрднрд╡рд╣реАрди рдкрд░реАрдХреНрд╖рдХ рднреА рдХрдВрдкреНрдпреВрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдореЗрдореЛрд░реА рд▓реАрдХ рдкрд╛ рд╕рдХреЗред
рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?
WeakReference рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧреАред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╡рд░реНрдЧ рдореВрд▓ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╡рд░реНрдЧ рдХреЛ рд╕рд░рд▓ рдФрд░ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдирд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо "рд▓реАрдХ" рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
package com.company.product; import java.lang.ref.WeakReference; import java.util.Collections; import java.util.Vector; import android.content.Context; import android.content.Intent; import android.text.TextUtils; public class LeaksManager { private static LeaksManager mThis = null; private final Vector<WeakReference<Object>> mRefs = new Vector<WeakReference<Object>>(); private LeaksManager() { super(); } public static LeaksManager getThis() { if (mThis == null) { mThis = new LeaksManager(); } return mThis; } public <T> T monitorObject(T obj) { if (obj == null) { return obj; } for (WeakReference<Object> ref : mRefs) { if (ref.get() == obj) { return obj; } } mRefs.add(new WeakReference<Object>(obj)); return obj; } public Vector<String> checkLeaks() { System.gc(); Vector<String> names = new Vector<String>(); for (int i = mRefs.size() - 1; i >= 0; i--) { WeakReference<Object> ref = mRefs.elementAt(i); Object obj = ref.get(); if (obj != null) { String className = obj.getClass().getSimpleName(); addUniqueClassName(names, TextUtils.isEmpty(className) ? "Unknown class name" : className); } else { mRefs.remove(i); } } mRefs.trimToSize(); return names; } private void addUniqueClassName(Vector<String> names, String className) { int index = -1; for (int j = 0; j < names.size(); j++) { if (names.elementAt(j).equals(className)) { index = j; break; } } if (index == -1) { names.add(names.getClass().getSimpleName()); } } }
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧрддрд┐рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреА рд╣реЛрдЧреА, рдЬреЛ рдХрд┐
LeaksManager.checkLeaks()
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧреА рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд
LeaksManager.checkLeaks()
ред рдпрд╣ рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕рдХреЗ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрдиреЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рджрдо рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд▓реАрдХреНрд╕рдореИрдиреЗрдЬрд░ рдкрд░ рдкрдбрд╝рддреА рд╣реИ:
Object obj = LeaksManager.getThis().monitorObject(new Object());
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЬрдЧрд╣ рдкрд░, рдЖрдк рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдХрдИ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХреБрдЫ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдпрд╣ рд╕рднреА рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЧрддрд┐рд╡рд┐рдзрд┐, рд╕реЗрд╡рд╛ рдХреЗ рдСрдирдСрд░реНрдХ () рдореЗрдВ рдореЙрдирд┐рдЯрд░рдСрдирдЬреЗрдХреНрдЯ () рдФрд░ рд╕рдВрднрд╡рддрдГ рд╕реНрдЯреНрд░реАрдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдпрд╣ рд╡рд░реНрдЧ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдХреЛрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рдореИрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЗ рд▓рд┐рдП "рддреНрд╡рд░рд┐рдд" рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ - рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рддреБрд░рдВрдд рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЦреБрдж рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдпрд╣ рд▓реЗрдЦ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ
AsyncTask рд╡рд░реНрдЧ рдХреА рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд
рдХрд░реВрдВрдЧрд╛