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基于方法池与回调怎么实现登录拦截”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

文章标题:Android基于方法池与回调怎么实现登录拦截,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/20932

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年8月27日 下午4:53
下一篇 2022年8月27日 下午4:55

相关推荐

  • Java怎么通过动态代理实现一个简单的拦截器操作

    一、代理 在使用动态代理实现拦截器之前我们先简单了解一下什么Java的代理。 代理,顾名思义,就是不直接操作被代理(下面都用目标对象称呼,听起来舒服一些)对象,而是通过一个代理对象去间接的使用目标对象中的方法。代理分为两种模式,一种是静态代理,一种是动态代理。接下来先写一个静态代理的例子。 无论是静…

    2022年8月27日
    65900
  • Redis处理接口幂等性的方案有哪些

    前言:接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。接口幂等性是指用户对于同一操作发起的一次请求或者多次…

    2022年8月31日
    84600
  • mysql的2002错误怎么解决

    在mysql中,2022错误指的是编译的时候没有指定socket,所以mysql命令连接的时候还是使用的默认值,因为socket位置变了,而mysql命令不知道,所以就出现了这样的错误,可以修改“/etc/my.cnf”文件来解决该错误。 本教程操作环境:windows10系统、mysql8.0.2…

    2022年9月1日
    1.2K00
  • python怎么导出项目需要的库

    今天小编给大家分享一下python怎么导出项目需要的库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 输入命令: pip freeze > requirements.txt 产生…

    2022年8月27日
    57100
  • SQL Server主键约束怎么创建

    SQL Server PRIMARY KEY(主键)约束简介 主键是少数标识表中每一行的一列或一组列。您可以使用主键约束为表创建主键。如果主键仅包含一列,你可以使用PRIMARY KEY约束作为列约束: CREATE TABLE table_name ( pk_column data_type PR…

    2022年9月8日
    61000
  • Java设计模式之装饰模式是什么及怎么实现

    1.什么是装饰模式 当我们想要改进或增强某个对象的功能,而又不想继承该类创建子类,可以考虑使用装饰模式。 使用装饰模式增强对象的某个功能,比生成子类再增强,更为灵活。 2.如何实现 1)抽象组件:定义一个抽象类,该抽象类定义了“被装饰者”需要被“装饰的方法” 2)具体组件:抽象组件的一个子类。成为“…

    2022年8月29日
    45400
  • cad块名称如何修改

    cad块名称修改方法: 1、首先打开CAD软件。 2、然后点击上面任务选项栏中的“格式”。 3、然后点击菜单中的“重命名”。 4、最后点击左侧的“块”然后编辑右侧的名字即可。 以上就是“cad块名称如何修改”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家…

    2022年8月30日
    1.0K00
  • vlookup函数多条件查找怎么使用

    vlookup函数多条件查找使用方法 方法一: 1、借助“if命令”可以同时筛选多个条件。 2、在这里,我们需要同时满足“姓名”和“工号”两个条件。 3、这时候,我们使用vlookup函数,先选定“E5&F5”作为条件。 4、接着使用if命令,让后面的调节需要满足姓名和工号两个条件。 5、使…

    2022年9月22日
    4.9K00
  • Redis发布订阅实例分析

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 订阅/发布消息图: 名列前茅个对象:消息发送者。第二个对象:频道。第三个对象:消息订阅者。 下图展示了频道 channel1 , 以及订阅这个频…

    2022年9月26日
    86900
  • SQL查询怎么给表起别名

    可以通过空格或者as给表起别名 但是注意如果操作的数据库是Oracle的话,只能使用空格,as不符合Oracle的语法。 举个栗子 简单查询中使用别名 select *from student swhere s.id = ’10’; 在简单的查询中使用别名,一般没有特别需要注意的地方,要做的操作少 …

    2022年9月8日
    59500
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部