Android内存优化之——static使用篇
[csdnµØÖ·]:http://blog.csdn.net/ys408973279/article/details/50389200
ÔÚAndroid¿ª·¢ÖУ¬ÎÒÃǾ³£»áʹÓõ½staticÀ´ÐÞÊÎÎÒÃǵijÉÔ±±äÁ¿£¬Æä±¾ÒâÊÇΪÁËÈöà¸ö¶ÔÏó¹²ÓÃÒ»·Ý¿Õ¼ä£¬½ÚÊ¡ÄÚ´æ,»òÕßÊÇʹÓõ¥Àýģʽ£¬ÈøÃÀàÖ»Éú²úÒ»¸öʵÀý¶øÔÚÕû¸öappÖÐʹÓá£È»¶øÔÚijЩʱºò²»Ç¡µ±µÄʹÓûòÕßÊDZà³ÌµÄ²»¹æ·¶È´»áÔì³ÉÁËÄÚ´æй¶ÏÖÏó(javaÉϵÄÄÚ´æй©ָÄÚ´æµÃ²»µ½gcµÄ¼°Ê±»ØÊÕ£¬´Ó¶øÔì³ÉÄÚ´æÕ¼Óùý¶àµÄÏÖÏó)
±¾ÎÄÖÐÎÒÃÇÖ÷Òª·ÖÎöµÄÊÇstatic±äÁ¿¶ÔactivtiyµÄ²»Ç¡µ±ÒýÓöøÔì³ÉµÄÄÚ´æй©£¬ÒòΪ¶ÔÓÚͬһ¸öActivityÒ³ÃæÒ»°ãÿ´Î´ò¿ªÊ±ÏµÍ³¶¼»áÖØÐÂÉú³ÉÒ»¸ö¸ÃactivityµÄ¶ÔÏó(standardģʽÏÂ)£¬¶øÿ¸öactivity¶ÔÏóÒ»°ã¶¼º¬ÓдóÁ¿µÄÊÓͼ¶ÔÏóºÍbitmap¶ÔÏó,Èç¹û֮ǰµÄactivity¶ÔÏó²»Äܵõ½¼°Ê±µÄ»ØÊÕ£¬´Ó¶ø¾ÍÔì³ÉÁËÄÚ´æµÄй©ÏÖÏó¡£
ÏÂÃæÒ»±ß¿´´úÂëÒ»±ß½²½â¡£
µ¥Àýģʽ²»ÕýÈ·µÄ»ñÈ¡context
public class LoginManager {
private Context context;
private static LoginManager manager;
public static LoginManager getInstance(Context context) {
if (manager == null)
manager = new LoginManager(context);
return manager;
}
private LoginManager(Context context) {
this.context = context;
}
ÔÚLoginActivityÖÐ
public class LoginActivity extends Activity {
private LoginManager loginManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
loginManager = LoginManager.getInstance(this);
}
ÕâÖÖ·½Ê½´ó¼ÒÓ¦¸ÃÒ»¿´¾ÍÃ÷°×ÎÊÌâÔÚÄÄÀïÁË£¬ÔÚLoginManagerµÄµ¥ÀýÖÐcontext³ÖÓÐÁËLoginActivityµÄthis¶ÔÏ󣬼´Ê¹µÇ¼³É¹¦ºóÎÒÃÇÌøתµ½ÁËÆäËûActivityÒ³Ã棬LoginActivityµÄ¶ÔÏóÈÔÈ»µÃ²»µ½»ØÊÕÒòΪËû±»µ¥ÀýËù³ÖÓУ¬¶øµ¥ÀýµÄÉúÃüÖÜÆÚÊÇͬApplication±£³ÖÒ»Öµġ£
ÕýÈ·µÄ»ñÈ¡contextµÄ·½Ê½
public class LoginManager {
private Context context;
private static LoginManager manager;
public static LoginManager getInstance(Context context) {
if (manager == null)
manager = new LoginManager(context);
return manager;
}
private LoginManager(Context context) {
this.context = context.getApplicationContext();
}
Ð޸ķ½Ê½Ò²·Ç³£¼òµ¥ÎÒÃǵ¥ÀýÖÐcontext²»ÔÙ³ÖÓÐActivityµÄcontext¶øÊdzÖÓÐApplicationµÄcontext¼´¿É£¬ÒòΪApplication±¾À´¾ÍÊǵ¥Àý£¬ËùÒÔÕâÑù¾Í²»»á´æÔÚÄÚ´æй©µÄµÄÏÖÏóÁË¡£
µ¥ÀýģʽÖÐͨ¹ýÄÚ²¿Àà³ÖÓÐactivity¶ÔÏó
µÚÒ»ÖÖ·½Ê½ÄÚ´æй©̫¹ýÓëÃ÷ÏÔ£¬ÏàÐÅ´ó¼Ò¶¼²»»á·¸ÕâÖÖ´íÎ󣬽ÓÏÂÀ´Òª½éÉܵÄÕâÖÖй©·½Ê½»á±È½Ï²»ÄÇôÈÝÒ×·¢ÏÖ£¬ÄÚ²¿ÀàµÄʹÓÃÔì³Éactivity¶ÔÏó±»µ¥Àý³ÖÓС£
»¹ÊÇ¿´´úÂëÔÙ·ÖÎö£¬ÏÂÃæÊÇÒ»¸öµ¥ÀýµÄÀࣺ
public class TestManager {
public static final TestManager INSTANCE = new TestManager();
private List<MyListener> mListenerList;
private TestManager() {
mListenerList = new ArrayList<MyListener>();
}
public static TestManager getInstance() {
return INSTANCE;
}
public void registerListener(MyListener listener) {
if (!mListenerList.contains(listener)) {
mListenerList.add(listener);
}
}
public void unregisterListener(MyListener listener) {
mListenerList.remove(listener);
}
}
interface MyListener {
public void onSomeThingHappen();
}
È»ºóÊÇactivity:
public class TestActivity extends AppCompatActivity {
private MyListener mMyListener=new MyListener() {
@Override
public void onSomeThingHappen() {
}
};
private TestManager testManager=TestManager.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testManager.registerListener(mMyListener);
}
}
ÎÒÃÇÖªµÀÔÚjavaÖУ¬·Ç¾²Ì¬µÄÄÚ²¿ÀàµÄ¶ÔÏó¶¼ÊÇ»á³ÖÓÐÖ¸ÏòÍⲿÀà¶ÔÏóµÄÒýÓõģ¬Òò´ËÎÒÃǽ«ÄÚ²¿Àà¶ÔÏómMyListenerÈõ¥ÀýËù³ÖÓÐʱ£¬ÓÉÓÚmMyListenerÒýÓÃÁËÎÒÃǵÄactivity¶ÔÏó£¬Òò´ËÔì³Éactivity¶ÔÏóÒ²²»Äܱ»»ØÊÕÁË£¬´Ó¶ø³öÏÖÄÚ´æй©ÏÖÏó¡£
ÐÞ¸ÄÒÔÉÏ´úÂ룬±ÜÃâÄÚ´æй©£¬ÔÚactivityÖÐÌí¼ÓÒÔÏ´úÂë:`
@Override
protected void onDestroy() {
testManager.unregisterListener(mMyListener);
super.onDestroy();
}
AsyncTask²»ÕýȷʹÓÃÔì³ÉµÄÄÚ´æй©
½éÉÜÍêÒÔÉÏÁ½ÖÖÇé¿öµÄÄÚ´æй©ºó£¬ÎÒÃÇÔÚÀ´¿´Ò»ÖÖ¸ü¼ÓÈÝÒ×±»ºöÂÔµÄÄÚ´æй©ÏÖÏ󣬶ÔÓÚAsyncTask²»ÕýȷʹÓÃÔì³ÉÄÚ´æй©µÄÎÊÌâ¡£
mTask=new AsyncTask<String,Void,Void>()
{
@Override
protected Void doInBackground(String... params) {
//doSamething..
return null;
}
}.execute("a task");
Ò»°ãÎÒÃÇÔÚÖ÷Ïß³ÌÖпªÆôÒ»¸öÒì²½ÈÎÎñ¶¼ÊÇͨ¹ýʵÏÖÒ»¸öÄÚ²¿ÀàÆä¼Ì³Ð×ÔAsyncTaskÀàÈ»ºóʵÏÖÆäÏàÓ¦µÄ·½·¨À´Íê³ÉµÄ£¬ÄÇô×ÔÈ»µÄmTask¾Í»á³ÖÓжÔactivityʵÀý¶ÔÏóµÄÒýÓÃÁË¡£²é¿´AsyncTaskµÄʵÏÖ£¬ÎÒÃÇ»áͨ¹ýÒ»¸öSerialExecutor´®ÐÐÏ̳߳ØÀ´¶ÔÎÒÃǵÄÈÎÎñ½øÐÐÅŶӣ¬¶øÕâ¸öSerialExecutor¶ÔÏó¾ÍÊÇÒ»¸östatic finalµÄ³£Á¿¡£
¾ßÌåµÄÒýÓùØϵÊÇ:
1.ÎÒÃǵÄÈÎÎñ±»·â×°ÔÚÒ»¸öFutureTaskµÄ¶ÔÏóÖÐ(Ëü³äµ±Ò»¸örunableµÄ×÷ÓÃ)£¬FutureTaskµÄʵÏÖÒ²ÊÇͨ¹ýÄÚ²¿ÀàÀ´ÊµÏֵģ¬Òò´ËËüҲΪ³ÖÓÐAsyncTask¶ÔÏ󣬶øAsyncTask¶ÔÏóÒýÓÃÁËactivity¶ÔÏó£¬Òò´Ëactivity¶ÔÏó¼ä½ÓµÄ±»FutureTask¶ÔÏó¸øÒýÓÃÁË¡£
2.futuretask¶ÔÏó»á±»Ìí¼Óµ½Ò»¸öArrayDequeÀàÐ͵ÄÈÎÎñ¶ÓÁеÄmTasksʵÀýÖÐ
3.mTasksÈÎÎñ¶ÓÁÐÓÖ±»SerialExecutor¶ÔÏóËù³ÖÓУ¬¸ÕҲ˵ÁËÕâ¸öSerialExecutor¶ÔÏóÊÇÒ»¸östatic finalµÄ³£Á¿¡£
¾ßÌåAsyncTaskµÄʵÏÖ´ó¼Ò¿ÉÒÔÈ¥²ÎÕÕÏÂÆäÔ´´úÂ룬ÎÒÕâÀï¾Íͨ¹ýÎÄ×ÖÃèÊöÒ»ÏÂÆäÌí¼ÓÈÎÎñµÄʵÏÖ¹ý³Ì¾Í¿ÉÒÔÁË£¬×ÜÖ®·ÖÎöÁËÕâô¶àͨ¹ý²ã²ãÒýÓúóÎÒÃǵÄactivity»á±»Ò»¸östatic±äÁ¿ËùÒýÓõ½¡£ËùÒÔÎÒÃÇÔÚʹÓÃAsyncTaskµÄʱºò²»ÒËÔÚÆäÖÐÖ´ÐÐÌ«ºÄʱµÄ²Ù×÷£¬¼ÙÉèactivityÒѾÍ˳öÁË£¬È»¶øAsyncTaskÀïÈÎÎñ»¹Ã»ÓÐÖ´ÐÐÍê³É»òÕßÊÇ»¹ÔÚÅŶӵȴýÖ´ÐУ¬¾Í»áÔì³ÉÎÒÃǵÄactivity¶ÔÏó±»»ØÊÕµÄʱ¼äÑÓºó£¬Ò»¶Îʱ¼äÄÚÄÚ´æÕ¼ÓÐÂʱä´ó¡£
½â¾ö·½·¨ÔÚactivityÍ˳öµÄʱºòÓ¦¸Ãµ÷ÓÃcancel()º¯Êý
@Override
protected void onDestroy() {
//mTask.cancel(false);
mTask.cancel(true);
super.onDestroy();
}
¾ßÌåcancel()Àï´«µÝtrue or falseÒÀʵ¼ÊÇé¿ö¶ø¶¨£º
1.µ±ÎÒÃǵÄÈÎÎñ»¹ÔÚÅŶÓûÓб»Ö´ÐУ¬µ÷ÓÃcancel()ÎÞÂÛtrue or false,ÈÎÎñ»á´ÓÅŶӶÓÁÐÖÐÒƳý£¬¼´ÈÎÎñ¶¼²»»á±»Ö´Ðе½ÁË¡£
2.µ±ÎÒÃǵÄÈÎÎñÒѾ¿ªÊ¼Ö´ÐÐÁË(doInBackground±»µ÷ÓÃ)£¬´«Èë²ÎÊýΪfalseʱ²¢²»»á´ò¶ÏdoInBackgroundµÄÖ´ÐУ¬´«Èë²ÎÊýΪtrueʱ£¬Èç¹ûÎÒÃǵÄÏ̴߳¦ÓÚÐÝÃß»ò×èÈû(Èç:sleep,wait)×´¿öÊÇ»á´ò¶ÏÆäÖ´ÐС£
ÕâÀï¾ßÌå½âÊÍÏÂcancle(true)µÄÒâÒ壺
mTask=new AsyncTask<String,Void,Void>()
{
@Override
protected Void doInBackground(String... params) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("test", "task is running");
return null;
}
}.execute("a task");
try {
//±£Ö¤taskµÃÒÔÖ´ÐÐ
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTask.cancel(true);
ÔÚÕâÑùµÄÇé¿öÏÂÎÒÃǵÄÏ̴߳¦ÓÚÐÝÃß״̬µ÷ÓÃcancel(true)·½·¨»á´ò¶ÏdoInBackgroundµÄÖ´ÐСª¡ª¼´²»»á¿´µ½logÓï¾äµÄÊä³ö¡£
µ«ÔÚÏÂÃæµÄÕâÖÖÇé¿öµÄʱºòÈ´´ò¶Ï²»ÁË
mTask=new AsyncTask<String,Void,Void>()
{
@Override
protected Void doInBackground(String... params) {
Boolean loop=true;
while (loop) {
Log.d("test", "task is running");
}
return null;
}
}.execute("a task");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTask.cancel(true);
ÓÉÓÚÎÒÃǵÄÏ̲߳»´¦Óڵȴý»òÐÝÃßµÄ×´¿ö¼°Ê±µ÷ÓÃcancel(true)Ò²²»ÄÜ´ò¶ÏdoInBackgroundµÄÖ´ÐСª¡ªÏÖÏó£ºlogº¯ÊýÒ»Ö±ÔÚ´òÓ¡Êä³ö¡£
½â¾ö·½·¨£º
mTask=new AsyncTask<String,Void,Void>()
{
@Override
protected Void doInBackground(String... params) {
//doSomething..
Boolean loop=true;
while (loop) {
if(isCancelled())
return null;
Log.d("test", "task is running");
}
return null;
}
}.execute("a task");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mTask.cancel(true);
ÕâÀïÎÒÃÇͨ¹ýÔÚÿ´ÎÑ»·ÊǼì²éÈÎÎñÊÇ·ñÒѾ±»cancleµô£¬Èç¹ûÊÇÔòÍ˳ö¡£Òò´Ë¶ÔÓÚAsyncTaskÎÒÃÇÒ²µÃ×¢Òâ°´ÕÕÕýÈ·µÄ·½Ê½½øÐÐʹÓ㬲»È»Ò²»áÔì³É³ÌÐòÄÚ´æй©µÄÏÖÏó¡£
ÒÔÉÏÄÚÈݾÍÊÇÔÚʹÓÃstaticʱ£¬ÎÒÃÇÐèÒªÔõô×ö²ÅÄÜÓÅ»¯ÄÚ´æµÄʹÓ㬵±È»¶ÔÓÚÒÔÉÏ3ÖÖÇé¿öÊÇÎÒÃDZà³ÌÖÐʹÓÃstatic¾³£Óöµ½µÄÄÚ´æй©µÄÇé¿ö£¬µ«ÈÔÈ»»¹ÓкܶàÇé¿öÎÒÃDz»Òײì¾õµ½¡£±ÈÈ磺Èç¹û²»×ö½éÉÜ£¬ÉÏÃæµÄµÚÈýÖÖÇé¿ö¾ÍºÜÄѲì¾õµ½£¬ÕâʱÎÒÃÇ×îÖÕµÄÄÚ´æй©ÓÅ»¯·½·¨¾ÍÊÇ:ʹÓÃÄÚ´æй©·ÖÎö¹¤¾ß£¬ÔÚÏÂһƪÎÄÕÂÀïÎÒ»á²ÎÕÕµÚÈýÖÖÇé¿ö(AsyncTask)Ôì³ÉµÄÄÚ´æй©£¬Í¨¹ýʹÓÃMAT¹¤¾ß½øÐзÖÎö£¬½²½âMATÅųýÄÚ´æй©µÄʹÓ÷½·¨¡£