LifecycleObserver解決點(diǎn)擊登錄后功能攔截

在開(kāi)發(fā)過(guò)程中是否遇到這么一個(gè)問(wèn)題,功能描述:點(diǎn)擊后執(zhí)行一段代碼繁堡,但是要在點(diǎn)擊的時(shí)候檢測(cè)是否已登錄瞎饲。這個(gè)功能很簡(jiǎn)單口叙,但登錄后要繼續(xù)執(zhí)行剛才那段代碼呢?是不是有點(diǎn)無(wú)頭緒了嗅战。在Java中可以用接口去回調(diào)妄田,但觸發(fā)的時(shí)間又是在登錄完成后俺亮。怎么辦?

其實(shí)對(duì)LifecycleObserver有了解的疟呐,大概都有思路了脚曾。LifecycleObserver是對(duì)Activity和Fragment的生命周期進(jìn)行監(jiān)聽(tīng),以便在特定的生命周期內(nèi)作出相關(guān)操作启具。思考下本讥,我們點(diǎn)擊后取到登錄界面,登錄回來(lái)的Activity是不是走了onResume呢鲁冯,那么登錄成功后拷沸,再走后續(xù)的方法:

public class LoginIntercept implements LifecycleObserver {
    private BlockIntentFun blockIntentFun;

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void resume(){
        if (BaseApplication.getInstance().isLogin){
            if (blockIntentFun != null){
                blockIntentFun.execute();
            }
            blockIntentFun = null;
        }
    }

    public void setBlockIntentFun(BlockIntentFun blockIntentFun) {
        this.blockIntentFun = blockIntentFun;
    }

    public interface BlockIntentFun{
        void execute();
    }
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 的意思是在onResume的時(shí)候執(zhí)行下面方法,方法名可以隨便定晓褪;因?yàn)槊看蝟nResume的時(shí)候都會(huì)走這個(gè)方法堵漱,所以執(zhí)行完要置空,不然每次都會(huì)被調(diào)用涣仿。

在Activity中勤庐,需要注冊(cè)生命周期的監(jiān)聽(tīng),分別在onStart和onDestroy加上監(jiān)聽(tīng)和移除監(jiān)聽(tīng)好港。

public class InterceptActivity extends AppCompatActivity {
    private LoginIntercept intercept;
    private TextView textView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intercept_activity);
        intercept = new LoginIntercept();
        textView = findViewById(R.id.text);
        textView.setOnClickListener(v -> loginCheck());
    }

    @Override
    protected void onStart() {
        super.onStart();
        getLifecycle().addObserver(intercept);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getLifecycle().removeObserver(intercept);
    }

    private void doSomething(){
        //點(diǎn)擊后要做的事
    }

    private void loginCheck(){
        //需要獲取登錄狀態(tài)愉镰,按自己需求設(shè)定
        if (BaseApplication.getInstance().isLogin){
            doSomething();
        }else{
            intercept.setBlockIntentFun(this::doSomething);
            startActivity(new Intent(getApplicationContext(),LoginActivity.class));
            //這里假設(shè)登錄成功了,實(shí)際操作按自己的邏輯來(lái)處理
            BaseApplication.getInstance().isLogin = true;
        }
    }
}

這樣就解決了钧汹,每次只在點(diǎn)擊的時(shí)候調(diào)用了丈探;假如用Kotlin的話,會(huì)方便很多拔莱,前提是對(duì)Kotlin的高階函數(shù)有了解

class LoginInterceptKt : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume(){
        if (BaseApplication.getInstance().isLogin){
            blockIntercept?.invoke()
        }
        blockIntercept = null
    }
}

private var blockIntercept: (() -> Unit)? = null
fun loginCheck(activityKt: InterceptActivityKt,block:(() -> Unit)?){
    if (BaseApplication.getInstance().isLogin){
        //如果登錄了就不攔截碗降,直接執(zhí)行
        block?.invoke()
    }else{
        activityKt.startActivity(Intent(activityKt,LoginActivity::class.java))
        //這里假設(shè)登錄成功了,實(shí)際按自己需求來(lái)處理
        blockIntercept = block
    }
}

用Kotlin的方式寫(xiě)看起來(lái)更簡(jiǎn)潔點(diǎn)塘秦,用高階函數(shù)取代了回調(diào)的功能讼渊。

class InterceptActivityKt : AppCompatActivity() {
    private val intercept by lazy { LoginInterceptKt() }

    override fun onStart() {
        super.onStart()
        lifecycle.addObserver(intercept)
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycle.removeObserver(intercept)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.intercept_activity)
        text.setOnClickListener {
            loginCheck(this) {
                doSomething()
            }
        }
    }

    private fun doSomething(){
        //點(diǎn)擊后要做的事
    }
}

解決這個(gè)問(wèn)題的方法可能有多種,但用這個(gè)方法解決的話尊剔,要對(duì)LifecycleObserver有了解爪幻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市须误,隨后出現(xiàn)的幾起案子挨稿,更是在濱河造成了極大的恐慌,老刑警劉巖京痢,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奶甘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡历造,警方通過(guò)查閱死者的電腦和手機(jī)甩十,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)船庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人侣监,你說(shuō)我怎么就攤上這事鸭轮。” “怎么了橄霉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵窃爷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姓蜂,道長(zhǎng)按厘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任钱慢,我火速辦了婚禮逮京,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘束莫。我一直安慰自己懒棉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布览绿。 她就那樣靜靜地躺著策严,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饿敲。 梳的紋絲不亂的頭發(fā)上妻导,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音怀各,去河邊找鬼倔韭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓢对,可吹牛的內(nèi)容都是我干的狐肢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沥曹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了碟联?” 一聲冷哼從身側(cè)響起妓美,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲤孵,沒(méi)想到半個(gè)月后壶栋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡普监,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年贵试,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琉兜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毙玻,死狀恐怖豌蟋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桑滩,我是刑警寧澤梧疲,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站运准,受9級(jí)特大地震影響幌氮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胁澳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一该互、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韭畸,春花似錦宇智、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至隘马,卻和暖如春太防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酸员。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蜒车, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幔嗦。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓酿愧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邀泉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嬉挡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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