當我們已經對某個按鈕做了防暴力點擊,但是依然在業務上有些復雜交互的情況,需要我們封裝一個防重Toast。針對這類情況,可以直接使用下面的showDebouncedToast
data class ToastInfo(val id: Any? = null,val command: MediaCommandDebouncer.MediaCommand? = null,val toastInfoId: Int = 0,val showTime: Long = 0L
)private var mShownToastInfo = ToastInfo()
private const val TOAST_DEBOUNCE_TIME = 1000L //1s內不可彈出重復Toast 自定義/*** 防重Toast方法,用于無法使用防暴力點擊的復雜場景* @param id 操作的內容的唯一標識* @param command 操作命令,可選* @param toastInfoId 字符串資源ID,-1代表網絡異常,0代表無效值* @param msg 要顯示的文本消息,優先使用這個參數*/
fun showDebouncedToast(id: Any? = null,command: Command? = null,toastInfoId: Int = 0,msg: String? = null
) {val currentTime = System.currentTimeMillis()// 防連彈檢查if (mShownToastInfo.toastInfoId == toastInfoId &&mShownToastInfo.id == id &&mShownToastInfo.command == command) {val timeDifference = currentTime - mShownToastInfo.showTimeif (mShownToastInfo.showTime != 0L && timeDifference in 0..TOAST_DEBOUNCE_TIME) {Log.i(TAG, "Already show similar toast recently, skip: ${getToastMessage(toastInfoId, msg)}")return}}// 顯示Toast 這里是自己封裝的showToast,就不在這里展示了,直接使用makeText也可以when {msg != null -> showToast(msg)toastInfoId == -1 -> showSystemNoNetworkToast()toastInfoId != 0 -> showToast(toastInfoId)else -> Log.w("ToastManager", "Invalid toast parameters")}// 更新記錄mShownToastInfo = ToastInfo(id, command, toastInfoId, currentTime)
}// 輔助方法,用于獲取Toast消息(用于日志)
private fun getToastMessage(toastInfoId: Int, msg: String?): String {return msg?: if (toastInfoId == -1) {"Network error toast"} else if (toastInfoId != 0) {try {SkinManager.getInstance().getString(toastInfoId)} catch (e: Exception) {"Toast resource ID: $toastInfoId"}} else {"Unknown toast"}
}
比如說,當前我對某個內容的id執行了一個操作command,它需要彈出一個stringId為toastInfoId的文言,我需要預防短時間內同一個id彈出多個Toast的情況,就可以使用showDebouncedToast,調用方法:
//傳R.string.xxxshowDebouncedToast(id, command, toastStringId)//傳msgshowDebouncedToast(id, command, "some msg")