一個(gè)“Toast”引發(fā)的bug

哈哈,蠻開心的,今天收到了簡(jiǎn)友的第一個(gè)喜歡费坊,謝謝~
相信大家都用過(guò)Toast提示:Toast.makeText(context,message, duration).show();一行很簡(jiǎn)單的代碼架专。但是有一個(gè)問(wèn)題就是同窘,當(dāng)我頻繁操作一個(gè)按鈕的時(shí)候,就會(huì)看到Toast一直顯示部脚,甚至有時(shí)候跳出這個(gè)Activity或者是App它還是按照順序逐一顯示想邦。今天優(yōu)化代碼,又想到了這個(gè)問(wèn)題委刘,所以就上網(wǎng)查了一下丧没,搜索到這么一篇文章,其代碼如下:

//就是定義一個(gè)全局的成員變量Toast, 這個(gè)Toast不為null的時(shí)候才去make,否則直接setText.
//為了按返回鍵后立即使Toast不再顯示锡移,重寫父類Activity的onBackPressed()方法里面去cancel你的Toast即可
private Toast mToast;
    public void showToast(String text) {  
        if(mToast == null) {  
            mToast = Toast.makeText(MobileSendTopicActivity.this, text, Toast.LENGTH_SHORT);  
        } else {  
            mToast.setText(text);    
            mToast.setDuration(Toast.LENGTH_SHORT);  
        }  
        mToast.show();  
    }  
      
    public void cancelToast() {  
            if (mToast != null) {  
                mToast.cancel();  
            }  
    }  
      
    public void onBackPressed() {  
            cancelToast();  
            super.onBackPressed();
    }  

按照他的思路呕童,我就在自己的項(xiàng)目里去實(shí)現(xiàn),但是由于我的項(xiàng)目里有自定義的Toast(通過(guò)new Toast(context)的方法實(shí)現(xiàn))和Toast.makeText(context,message, duration).show();不同淆珊,兩種混合使用拉庵,就會(huì)在程序中報(bào)類似以下錯(cuò)誤:

ToastError.png

為了避免這種錯(cuò)誤,要么不用自定義的Toast(不可能)套蒂,要么全部用自定義的(工作量有點(diǎn)大钞支,不想改),所以我就在類中定義了兩個(gè)全局成員變量

private static Toast mToast;
private static Toast mCustomToast;

下面貼上我的Tst.java代碼:

public class Tst {
    private Tst() {
        /* cannot be instantiated */
        throw new UnsupportedOperationException("cannot be instantiated");
    }
    private static Toast mToast;
    private static Toast mCustomToast;
    private static Toast initToast(Context context,CharSequence message, int duration) {
        if (mToast == null) {
            mToast = Toast.makeText(context, message,duration);
        }
        mToast.setText(message);
        mToast.setDuration(duration);
     return mToast;
    }
    private static Toast initToast(Context context,int message, int duration) {
        if (mToast == null) {
            mToast = Toast.makeText(context, message,duration);
        }
        mToast.setText(message);
        mToast.setDuration(duration);
        return mToast;
    }
    private static Toast initCustomToast(Context context, CharSequence message, ToastType toastType, int duration) {
        LinearLayout toastView = initToastView(context, message, toastType);
        if (mCustomToast == null) {
            mCustomToast = new Toast(context);
        }
        mCustomToast.setGravity(Gravity.CENTER, 0, 0);
        mCustomToast.setDuration(duration);
        mCustomToast.setView(toastView);
        return mCustomToast;
    }
    /**
     * 短時(shí)間顯示Toast
     * @param context
     * @param message
     */
    public static void showShort(Context context, CharSequence message) {
        initToast(context,message,Toast.LENGTH_SHORT).show();
    }
    /**
     * 短時(shí)間顯示Toast
     * @param context
     * @param message
     */
    public static void showShort(Context context, int message) {
        initToast(context,message,Toast.LENGTH_SHORT).show();
    }
    /**
     * 自定義view Toast
     */
    public static void showShort(Context context, CharSequence message, ToastType toastType) {
        initCustomToast(context, message, toastType, Toast.LENGTH_SHORT).show();
    }
    /**
     * 長(zhǎng)時(shí)間顯示Toast
     * @param context
     * @param message
     */
    public static void showLong(Context context, CharSequence message) {
        initToast(context,message,Toast.LENGTH_LONG).show();
    }
    /**
     * 長(zhǎng)時(shí)間顯示Toast
     * @param context
     * @param message
     */
    public static void showLong(Context context, int message) {
        initToast(context,message,Toast.LENGTH_LONG).show();
    }
    public static void showLong(Context context, CharSequence message, ToastType toastType) {
        initCustomToast(context, message, toastType, Toast.LENGTH_LONG).show();
    }
    /**
     * 自定義顯示Toast時(shí)間
     * @param context
     * @param message
     * @param duration
     */
    public static void show(Context context, CharSequence message, int duration) {
        initToast(context,message,duration).show();
    }
    /**
     * 自定義顯示Toast時(shí)間
     * @param context
     * @param message
     * @param duration
     */
    public static void show(Context context, int message, int duration) {
        initToast(context,message,duration).show();
    }
    public static void show(Context context, int msgId, int duration, ToastType toastType) {
        CharSequence message = context.getResources().getText(msgId);
        initCustomToast(context,message,toastType ,duration).show();
    }
    private static LinearLayout initToastView(Context context, CharSequence message, ToastType toastType) {
        int resId;
        int dp2px10 = DensityUtils.dp2px(context, 10);
        LinearLayout layout = new LinearLayout(context);
        layout.setBackgroundResource(R.drawable.bg_toast);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setMinimumWidth(DensityUtils.dp2px(context, 122));
        ImageView imageCodeProject = new ImageView(context);
        switch (toastType) {
            default:
            case DONE:
                resId = R.drawable.icon_toast_done;
                break;
            case WARNING:
                resId = R.drawable.icon_toast_warning;
                break;
        }
        imageCodeProject.setImageResource(resId);
        LinearLayout.LayoutParams layoutParams1 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        layoutParams1.setMargins(0, dp2px10 * 2, 0, 0);
        layout.addView(imageCodeProject, layoutParams1);
        LinearLayout.LayoutParams layoutParams2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        layoutParams2.setMargins(dp2px10, DensityUtils.dp2px(context, 14) , dp2px10, DensityUtils.dp2px(context, 22));
        TextView textView = new TextView(context);
        textView.setText(message);
        textView.setTextColor(Color.WHITE);
        textView.setGravity(Gravity.CENTER_HORIZONTAL);
        layout.addView(textView, layoutParams2);
        return layout;
    }
}

———————————————分隔線———————————————————
事實(shí)證明操刀,我的這種方法不可取啊烁挟,由于toast被定義為static,并且在產(chǎn)生Toast的時(shí)候傳入了Context,使得context一直得不到釋放骨坑,最終導(dǎo)致了內(nèi)存泄漏問(wèn)題撼嗓。在此,推薦大家讀如何在你的應(yīng)用中正確使用Context或者Context欢唾,什么是Context且警?這篇文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礁遣,一起剝皮案震驚了整個(gè)濱河市斑芜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祟霍,老刑警劉巖杏头,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沸呐,居然都是意外死亡醇王,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門崭添,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寓娩,“玉大人,你說(shuō)我怎么就攤上這事〖椋” “怎么了寞埠?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)排嫌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缰犁,這世上最難降的妖魔是什么淳地? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮帅容,結(jié)果婚禮上颇象,老公的妹妹穿的比我還像新娘。我一直安慰自己并徘,他們只是感情好遣钳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麦乞,像睡著了一般蕴茴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姐直,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天倦淀,我揣著相機(jī)與錄音,去河邊找鬼声畏。 笑死撞叽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的插龄。 我是一名探鬼主播愿棋,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼均牢!你這毒婦竟也來(lái)了糠雨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤徘跪,失蹤者是張志新(化名)和其女友劉穎见秤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體真椿,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹃答,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了突硝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测摔。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锋八,到底是詐尸還是另有隱情浙于,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布挟纱,位于F島的核電站羞酗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏紊服。R本人自食惡果不足惜檀轨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欺嗤。 院中可真熱鬧参萄,春花似錦、人聲如沸煎饼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吆玖。三九已至筒溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沾乘,已是汗流浹背铡羡。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留意鲸,地道東北人烦周。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怎顾,于是被迫代替她去往敵國(guó)和親读慎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容