Toast 是 Android 開發(fā)最常見的組件之一纤壁,經(jīng)常用 toast 來顯示一些提示信息,但在開發(fā)中經(jīng)常有這樣一個問題:連續(xù)點擊某個按鈕捺信,toast 會一直現(xiàn)酌媒,如果點擊的次數(shù)很多,可能會有十幾秒的時間都在顯示 toast迄靠,這樣的用戶體驗就不是很好秒咨。
Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
上面的這種創(chuàng)建方法是最常見的一種梨水,尤其是配合 Android Studio 插件一起使用時更加方便快捷拭荤,只需要打幾個字母就可以創(chuàng)建完成。但是這樣的創(chuàng)建方法就會導(dǎo)致上述問題疫诽,那么該如何解決呢舅世?
進(jìn)去 Toast 源碼查看 makeText 方法可以看到這個方法會返回一個 Toast 對象,如果我們的代碼寫成這樣:
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show();
}
});
每點擊一次就會創(chuàng)建一個 Toast 對象奇徒,每個 Toast 對象都會顯示幾秒雏亚,這樣問題就出來了,其實到這里就可以看出問題的根本原因是每次點擊都會創(chuàng)建一個 Toast 對象摩钙,如果設(shè)置成只有一個 Toast 對象罢低,不管怎么點擊都不會創(chuàng)建新的對象,而是只有已經(jīng)創(chuàng)建好的對象,這樣問題是不是就可以解決了呢网持,用代碼驗證一下就知道了宜岛。
Toast toast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (toast == null){
toast = Toast.makeText(getApplicationContext(),"content ",Toast.LENGTH_SHORT);
}else {
toast.setText("content");
}
toast.show();
}
});
先定義一個 Toast 對象,在點擊時判斷 toast 是否為空功舀,如果為空則創(chuàng)建一個 Toast 對象萍倡,不為空就直接設(shè)置顯示信息。這樣就可以避免每次點擊都會創(chuàng)建 Toast 對象的問題了辟汰。
如果每次需要 Toast 的時候都這么寫一次就太煩瑣了列敲,所以接下來的事情就是封裝,封裝成一個 Toast 的工具類帖汞,一次封裝戴而,到處使用,這個很程序員 翩蘸,嘻嘻……
public class ShowToast {
private static Toast toast;
public static void showToastOne(Context context,int content){
if (toast == null){
toast = Toast.makeText(context,content + "",Toast.LENGTH_SHORT);
}else {
toast.setText(content + "");
}
toast.show();
}
public static void showToastOne(Context context,String content){
if (toast == null){
toast = Toast.makeText(context,content + "",Toast.LENGTH_SHORT);
}else {
toast.setText(content + "");
}
toast.show();
}
}
PS:
在使用的時候這里的 context 要使用 getApplicationContext()所意,像下面這樣,
ShowToast.showToastOne(getApplicationContext(),"content");
因為 Toast 是用 static 修飾的鹿鳖,否則會引起內(nèi)存泄漏扁眯。
多謝 男人1984 這位朋友的指正,寫的時候沒有考慮太多翅帜,也沒有想到內(nèi)存泄漏這個問題,特意說明一下命满,希望看到的小伙伴們也都注意起這個問題來涝滴。加油!=禾ā歼疮!