91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android基于方法池與回調怎么實現登錄攔截

發布時間:2022-08-26 11:53:14 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Android基于方法池與回調怎么實現登錄攔截”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Android基于方法池與回調怎么實現登錄攔截”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、使用通知與回調

其實本質邏輯就是想判斷用戶是否已經登錄,然后跳轉到登錄頁面,登錄完成之后再跳轉到個人中心,那我們使用通知回調不就行了嗎?

在登錄完成之后發出通知,在首頁我們接受這個通知就調用去個人中心的方法不就行了嗎?

使用通知的方式有很多,這里我們以LiveEventBus為例:

public class FunctionManager {
    private static FunctionManager functionManager;
    private static HashMap<String, Function> mFunctionMap;
    public FunctionManager() {
        mFunctionMap = new HashMap<>();
    }
    public static FunctionManager get() {
        if (functionManager == null) {
            functionManager = new FunctionManager();
        }
        return functionManager;
    }
    public void addLoginCallback(LifecycleOwner owner, ILoginCallback callback) {
        LiveEventBus.get("login", Boolean.class).observe(owner, aBoolean -> {
            if (aBoolean != null && aBoolean) {
                callback.callback();
            }
        });
    }
    public interface ILoginCallback {
        void callback();
    }
    public void finishLogin() {
        LiveEventBus.get("login").post(true);
    }
}

我們封裝一個發送事件和一個接收事件,注意使用的時候添加回調的方法不要放在點擊事件中。否則多次點擊會重復調用的。

    override fun startObserve() {
        FunctionManager.get().addLoginCallback(this) {
            gotoProfilePage()
        }
    }
    override fun init() {
        mBtnCleanToken.click {
            SP().remove(Constants.KEY_TOKEN)
            toast("清除成功")
        }
        mBtnProfile.click {
            checkLogin()
        }
    }
    private fun checkLogin() {
        if (SP().getString(Constants.KEY_TOKEN, "").checkEmpty()) {
            gotoLoginPage()
        } else {
            gotoProfilePage()
        }
    }
    private fun gotoLoginPage() {
        gotoActivity&lt;LoginDemoActivity&gt;()
    }
    private fun gotoProfilePage() {
        gotoActivity&lt;ProfileDemoActivity&gt;()
    }

效果:

Android基于方法池與回調怎么實現登錄攔截

二、使用方法池

上面一種方法依賴于LiveData,我們都知道LiveData的值在一些特性情況下并不保險,當然我們可以使用FlowBus來緩解這一問題(只能在Kotlin項目中使用了),并且還存在使用不當,導致多次訂閱,就會發生執行N此的邏輯。就需要我們再添加回調的方法中自己判斷去重的邏輯。如果大家有興趣也可以自行擴展,并不復雜

我們還可以使用另一種方便的方式,支持 Java 和 Kotlin ,我們使用方法池把需要執行的方法放入緩存中,當我們登錄成功之后再把緩存中的方法拿出來執行,可以靈活放入多個方法。

定義方法對象

public abstract class IFunction {
    public String functionName;
    public IFunction(String functionName) {
        this.functionName = functionName;
    }
    protected abstract void function();
}

方法管理類

public class FunctionManager {
    private static FunctionManager functionManager;
    private static HashMap<String, IFunction> mFunctionMap;
    public FunctionManager() {
        mFunctionMap = new HashMap<>();
    }
    public static FunctionManager get() {
        if (functionManager == null) {
            functionManager = new FunctionManager();
        }
        return functionManager;
    }
    /**
     * 添加方法
     */
    public FunctionManager addFunction(IFunction function) {
        if (mFunctionMap != null) {
            mFunctionMap.put(function.functionName, function);
        }
        return this;
    }
    /**
     * 執行方法
     */
    public void invokeFunction(String key) {
        if (TextUtils.isEmpty(key)) {
            return;
        }
        if (mFunctionMap != null) {
            IFunction function = mFunctionMap.get(key);
            if (function != null) {
                function.function();
                //用完移除掉
                removeFunction(key);
            } else {
                try {
                    throw new RuntimeException("function not found");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 使用之后移除相關的緩存
     */
    public void removeFunction(String key) {
        if (mFunctionMap != null) {
            mFunctionMap.remove(key);
        }
    }
}

使用:

 override fun init() {
        mBtnCleanToken.click {
            SP().remove(Constants.KEY_TOKEN)
            toast("清除成功")
        }
        mBtnProfile.click {
            checkLogin()
        }
    }
    private fun checkLogin() {
        if (SP().getString(Constants.KEY_TOKEN, "").checkEmpty()) {
            FunctionManager.get().addFunction(object : IFunction("gotoProfilePage") {
                override fun function() {
                    gotoProfilePage()
                }
            })
            gotoLoginPage()
        } else {
            gotoProfilePage()
        }
    }
    private fun gotoLoginPage() {
        gotoActivity<LoginDemoActivity>()
    }
    private fun gotoProfilePage() {
        gotoActivity<ProfileDemoActivity>()
    }

我這里是為了兼容其他的場景使用,需要傳入方法的key,如果大家只想用于攔截登錄這一個場景,大家可以把Key的值固定化。

記得在LoginActivity中登錄成功的時候回調處理

    fun doLogin() {
        showStateLoading()
        CommUtils.getHandler().postDelayed({
            showStateSuccess()
            SP().putString(Constants.KEY_TOKEN, "abc")
            finish()
            //方法池的方式
             FunctionManager.get().invokeFunction("gotoProfilePage")
            }, 500)
        }

效果和使用通知的效果一致

Android基于方法池與回調怎么實現登錄攔截

讀到這里,這篇“Android基于方法池與回調怎么實現登錄攔截”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普宁市| 安新县| 黎川县| 洞口县| 泽普县| 孟州市| 彭阳县| 屏南县| 扶余县| 教育| 林州市| 德令哈市| 博乐市| 灵寿县| 上虞市| 淮阳县| 益阳市| 金阳县| 西昌市| 南雄市| 东台市| 胶南市| 漳浦县| 宝应县| 宁安市| 广平县| 奇台县| 化州市| 土默特右旗| 巴中市| 青阳县| 和龙市| 洛隆县| 大庆市| 浦北县| 临沭县| 民丰县| 石台县| 卓尼县| 阜宁县| 天长市|