android自定義單例loadingDialog

該dialog支持在展示過程中變更文字內(nèi)容,并避免dialog生命周期引起的崩潰閃退問題椭赋。

object GlobalDialogManager {

    private var dialog: AlertDialog? = null
    private var dialogTextView: TextView? = null
    private var isDialogShowing = false
    private val lock = Any()
    private var job: Job? = null
    private var contextRef: WeakReference<Context>? = null

    //展示dialog,并在20秒后自動(dòng)取消dialog彈框并可以通過callBack做后續(xù)功能
    fun showDialog(context: Context, msg: String? = null, callBack: () -> Unit?) {
        val activity = context as? Activity ?: return
    //判斷dialog是否已經(jīng)展示疮跑,并且activity并未被消耗胖喳,展示的avtivit也是處于棧頂
        if (isDialogShowing || activity.isFinishing || activity.isDestroyed || !FoxApp.instance().lifecycle.isActivityForeground(activity)) return
        synchronized(lock) {
            try {
                contextRef = WeakReference(context)
                if (dialog == null) {
                    val builder = AlertDialog.Builder(context, R.style.loadingDialog)
                    val inflater = LayoutInflater.from(context)
                    val dialogView = inflater.inflate(R.layout.dialog_loading_http, null)
                    dialogTextView = dialogView.findViewById(R.id.tv_loading)
                    builder.setView(dialogView)
                    dialog = builder.create().apply {
                        setCancelable(false)
                        setCanceledOnTouchOutside(false)
                    }
                    dialog?.window?.setDimAmount(0f)
                }
                if (!activity.isFinishing && !activity.isDestroyed && FoxApp.instance().lifecycle.isActivityForeground(
                                activity) && !isDialogShowing) {
                    job = GlobalScope.launch(Dispatchers.Main) {
                        dialog?.show()
                        isDialogShowing = true
                        dialogTextView?.text = msg ?: context.getString(R.string.loading_wait) // 延遲 20 秒后關(guān)閉對(duì)話框
                        delay(20000)
                        if (dialog != null && (isDialogShowing || dialog?.isShowing == true)) {
                            dismissDialog(context)
                            callBack?.invoke()
                        }
                    }
                }
            } catch (e: Exception) {
                LogUtils.e("GlobalDialogManager", "Error showing dialog", e)
            }
        }
    }

//展示過程中修改文字
    fun updateText(newText: String?) {
        synchronized(lock) {
            CoroutineScope(Dispatchers.Main).launch {
                dialogTextView?.text = newText ?: FoxApp.instance().getString(R.string.loading_wait)
            }
        }
    }

    fun initDialog() {
        synchronized(lock) {
            dialog = null
            isDialogShowing = false
        }
    }


    fun dismissDialog(context: Context) {
        synchronized(lock) {
            GlobalScope.launch(Dispatchers.Main) {
                val activity = context as? Activity
                val shouldDismiss =
                        activity == null || !activity.isFinishing && !activity.isDestroyed && FoxApp.instance().lifecycle.isActivityForeground(
                                activity)

                if (shouldDismiss && dialog != null && (isDialogShowing || dialog?.isShowing == true)) {
                    job?.cancel()
                    dialog?.dismiss()
                    isDialogShowing = false
                    contextRef?.clear()
                    contextRef = null
                }
            }
        }
    }

    fun cleanUp() {
        synchronized(lock) {
            job?.cancel()  // 取消延遲任務(wù)
            if (isDialogShowing) {
                dialog?.dismiss()
            }
            contextRef?.clear()
            contextRef = null
            isDialogShowing = false
            dialog = null
            dialogTextView = null
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市儿普,隨后出現(xiàn)的幾起案子崎逃,更是在濱河造成了極大的恐慌,老刑警劉巖眉孩,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件个绍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浪汪,警方通過查閱死者的電腦和手機(jī)巴柿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來死遭,“玉大人广恢,你說我怎么就攤上這事⊙教叮” “怎么了钉迷?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钠署。 經(jīng)常有香客問我糠聪,道長(zhǎng),這世上最難降的妖魔是什么谐鼎? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任舰蟆,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘身害。我一直安慰自己味悄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布塌鸯。 她就那樣靜靜地躺著傍菇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪界赔。 梳的紋絲不亂的頭發(fā)上丢习,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音淮悼,去河邊找鬼咐低。 笑死,一個(gè)胖子當(dāng)著我的面吹牛袜腥,可吹牛的內(nèi)容都是我干的见擦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼羹令,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鲤屡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起福侈,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤酒来,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肪凛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堰汉,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伟墙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戳葵,死狀恐怖就乓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拱烁,我是刑警寧澤生蚁,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站邻梆,受9級(jí)特大地震影響守伸,放射性物質(zhì)發(fā)生泄漏绎秒。R本人自食惡果不足惜浦妄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剂娄,春花似錦蠢涝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耳胎,卻和暖如春惯吕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怕午。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工废登, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郁惜。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓堡距,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親兆蕉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽戒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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