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

相关推荐

  • windows的任务管理器如何打开

    打开任务管理器的多种方式 方法一:使用Ctrl+Shift+Esc组合键调出任务管理器。 方法二:用鼠标右键点击任务栏选择“任务管理器”, 方法三:使用组合键“Win+R”键打开运行对话框,输入taskmgr,回车,即打开 方法四:按顺序连续按住Ctrl、Alt和Delete键 方法五:直接找到Ta…

    2022年9月6日
    6000
  • windows 0xc000007b修复了没用怎么解决

    解决方法: 方法一: 1、首先点击左下角开始菜单,找到“windows系统”下的“控制面板” 2、然后点击其中的“卸载程序”,将图示的两个程序给卸载。卸载完成后再重新下载安装。 3、重装完成后再去尝试打开软件或游戏应该就可以了。 方法二: 1、如果重装完vc还是启动不了,那么可以尝试重置系统。 2、…

    2022年9月15日
    4400
  • Vue3项目中如何引入SVG图标

    SVG 图标 既然是页面,肯定离不开一些图标 icon ,所以肯定要去最全的 阿里图标库 来寻找 这里讲解下如何将 阿里图标库 里面的东西,放到我们的页面上 阿里图标库 进入页面,找到 资源管理 下面的 我的项目,并创建项目 设置如下 创建好项目后,我们进入到 阿里的 素材库 里面找一些后续需要的图…

    2022年8月31日
    34800
  • windows谷歌浏览器怎么禁用js

    谷歌浏览器禁用js的方法: 1、点击左上角的三个点然后点击“设置”。 2、进入后下滑点击最下方的“高级”。 3、之后点击“内容管理”。 4、点击开关即可禁用js插件。 以上就是“windows谷歌浏览器怎么禁用js”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都…

    2022年9月8日
    6900
  • php unserialize反序列化漏洞分析

    题目如下: 漏洞解析: (上图代码第11行正则表达式应改为:’/O:d:/’) 题目考察对php反序列化函数的利用。在第10行 loadData() 函数中,我们发现了 unserialize 函数对传入的 $data 变量进行了反序列。在反序列化前,对变量内容进行了判断,先…

    2022年8月30日
    23200
  • windows会声会影导出视频mp4格式的方法

    会声会影导出视频mp4格式的方法 1、首先点击上方的“共享”。 2、点击右侧的“MPE4”。 3、我们可以在配置文件中更改视频具体参数。 4、然后修改文件名和渲染解码方式。 5、最后点击右边的文件夹选择保存路径,点击“开始”开始导出。 6、等待渲染完成导出视频就可以了。 以上就是关于“windows…

    2022年9月15日
    6400
  • css语言中漂浮的语法是什么

    css语言中的漂浮语法为“float:属性值;”。float属性用于定义元素在哪个方向浮动,会让盒子(元素)漂浮在标准流的上面,其周围的元素也会重新排列,直到它的外边缘碰到包含框或另一个浮动框的边框为止。该属性有三个属性值:1、“left”,定义元素向左浮动;2、“right”,定义元素向右浮动;3…

    2022年9月22日
    12500
  • 电脑黑白打印机能不能扫描出彩色

    黑白打印机能扫描出彩色的吗 答:黑白打印机能扫描出彩色的。 1、如果你的黑白打印机带有扫描功能,那就可以扫描彩色。 2、因为扫描和打印是分开的,不能打印彩色与扫描彩色没有关系。 3、如果我们想要扫描彩色内容的话,可以先连接打印机,打开它。 4、打开后,在“打印与扫描”下选择“扫描文档或照片” 5、然…

    2022年9月24日
    18700
  • 如何进行Apache HTTP组件提权漏洞利用过程深度分析

    Apache HTTP 被发现存在本地提权漏洞(CVE-2019-0211),漏洞作者在第一时间就给出了WriteUp和漏洞EXP,阿尔法实验室也对EXP进行了深入分析,在此将分析的笔记整理分享出来,希望对大家理解该漏洞有所帮助。下面内容主要按着EXP的执行步骤一步步讲解,同时详细解释了利用过程中几…

    2022年9月15日
    10200
  • MySql如何查出符合条件的最新数据行

    结合示例: 这是一张记录人员来访的记录表。 数据表里的数据准确记录了每个人来访时带的帽子颜色、时间、人员编码(每个人唯一)。 数据样例: 需要做到的是 : 拿出符合条件的最新的来访记录。 你会最怎么做? 先实现一点的, 取出 A101 这个人员编码的 最新来访记录 。 首先先展示错误的sql示例: …

    2022年9月16日
    12500
联系我们
关注微信
关注微信
分享本页
返回顶部
PingCode 比 Jira 更好用的研发管理工具。免费试用         文章及站点合作,请添加微:All-FeiFei