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ÅųýÄÚ´æй©µÄʹÓ÷½·¨¡£