Android基于方法池与回调怎么实现登录拦截
更新:2023-06-12 16:41:05
人气:322
来源:互联网转载
A+
本文小编为大家详细介绍“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)
}效果和使用通知的效果一致

推荐的文章
PHP经验分享
- ● PHP批量对TCP服务端指定多个IP非阻塞检查在线状态
- ● python实现TCP服务端持续接收关机、重启指令并输出结果【系列三】
- ● PHP给TCP服务端发送指令【系列二】
- ● PHP判断TCP服务端是否在线【系列一】
- ● PHP判断远程文件是否存在
- ● LINUX下用PHP获取CPU型号、内存占用、硬盘占用等信息代码
- ● PHP代码用UDP方式远程唤醒电脑让计算机开机
- ● apache下php生成验证码图片不能显示
- ● PHP使用AES加密解密示例(无偏移)
- ● Pluginmysql_native_passwordreported:''mysql_native_password'isdeprecate问题








