一、使用通知与回调
其实本质逻辑就是想判断用户是否已经登录,然后跳转到登录页面,登录完成之后再跳转到个人中心,那我们使用通知回调不就行了吗?
在登录完成之后发出通知,在首页我们接受这个通知就调用去个人中心的方法不就行了吗?
使用通知的方式有很多,这里我们以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基于方法池与回调怎么实现登录拦截”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
文章标题:Android基于方法池与回调怎么实现登录拦截,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/20932