Android靜態工具類ToastUtil因為傳入content不當導致Activity記憶體洩露

王世暉發表於2016-03-14

實現了一個防止內容重複彈出的Toast工具類,防止內容重複彈出,並且新的Toast會立刻覆蓋舊的Toast,不會排隊等待就Toast顯示結束才顯示

public class ToastUtil {
    private static String oldMsg;
    protected static Toast toast   = null;
    private static long oneTime=0;
    private static long twoTime=0;
    public static void showShortToast(Context mContext, String msg) {
        if(toast==null){
            /*這種寫法如果傳入Activity的例項進來,將有可能會導致Activvity洩露
            * 因為靜態工具類的生存週期*/
//            toast =Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);
            /*這樣的話,不管傳遞什麼content進來,都只會引用全域性唯一的Content,不會產生記憶體洩露*/
            toast =Toast.makeText(mContext.getApplicationContext(), msg, Toast.LENGTH_SHORT);
            toast.show();
            oneTime=System.currentTimeMillis();
        }else{
            twoTime=System.currentTimeMillis();
            if(msg.equals(oldMsg)){
                if(twoTime-oneTime>Toast.LENGTH_SHORT){
                    toast.show();
                }
            }else{
                oldMsg = msg;
                toast.setText(msg);
                toast.show();
            }
        }
        oneTime=twoTime;
    }
}
呼叫的時候,如果按照原來的寫法:

 toast =Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);

這樣呼叫:

ToastUtil.showShortToast(INeedHelpActivity.this, "伺服器連線異常");
將會導致INeedHelpActivity記憶體洩露


若想記憶體不洩露,可以這樣呼叫:

 ToastUtil.showShortToast(getApplicationContext(), "網路連線異常");

當然最簡單的方法是在工具類裡邊直接轉換,呼叫出的程式碼將不用修改

toast =Toast.makeText(mContext.getApplicationContext(), msg, Toast.LENGTH_SHORT);

相關文章