您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“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<LoginDemoActivity>() } private fun gotoProfilePage() { gotoActivity<ProfileDemoActivity>() }
效果:
上面一種方法依賴于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基于方法池與回調怎么實現登錄攔截”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。