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会声会影导出视频mp4格式的方法

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

    2022年9月15日
    13900
  • word页面颜色如何更改

    word页面颜色更改方法: 1、首先进入word然后点击屏幕上方的“页面布局”。 2、然后点击“页面颜色”。 3、选择自己喜欢的颜色。 4、你也可以点击其他颜色,选择自己喜欢但是没有的颜色。 5、最后返回word界面就可以看到颜色已经更改完成了。 关于“word页面颜色如何更改”的内容就介绍到这里了…

    2022年9月19日
    24500
  • Redis常见分布锁的原理是什么和怎么实现

    常见的分布式锁的实现如下图: 基于数据库 悲观锁 悲观锁(Pessimistic Lock)顾名思义为很悲观的锁,每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放,悲观锁中的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程,但是在效率方面,处理加锁的机制…

    2022年8月30日
    16400
  • PHP程序中怎么运行Python脚本

    一、exec() 执行一个外部程序 exec ( string $command [, array &$output [, int &$return_var ]] ) : string 参数说明: command:要执行的命令,其中包括三个子串,名列前茅个子串为使用的当前系统的解释器…

    2022年9月10日
    27800
  • col在html中指的是什么

    col在html中是“列”的意思;col是html中的标签,是“column”的缩写,该标签是给表格中一个或者多个列应用样式,而不需要重复为每个单元格或每一行设置样式,标签规定了元素内部每一列的属性,只能在table或colgroup元素中使用该标签。 本教程操作环境:windows10系统、HTM…

    2022年9月2日
    18100
  • 电脑蓝屏代码0x000009c如何解决

    解决方法: 方法一: 1、首先重启电脑,按住“F8”进入以下界面,然后进入“安全模式” 2、要是可以进入安全模式,就在其中将最近安装的驱动或软件全部卸载。 3、还有可能是因为系统中了病毒,所以可以尝试在安全模式中清理一下病毒。 4、如果进不去安全模式,那就是内存或硬件出现问题,就需要用下面的方法来解…

    2022年9月16日
    32300
  • 如何深度分析宽字节sql注入

    基本概念 宽字节是相对于ascII这样单字节而言的;像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节 GBK是一种多字符的编码,通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节 转义函数:为了过滤用户输入的…

    2022年9月21日
    24700
  • 如何使用Masscan、Nmap、ELK做内网资产收集

    安装 安装masscan # yum install git gcc make libpcap-devel# git clone https://github.com/robertdavidgraham/masscan# cd masscan# make# cp bin/masscan /bin 安…

    2022年9月8日
    34500
  • word如何生成目录

    word生成目录的方法: 1、首先打开你的Word文档,并进入或者输入一些内容。 2、选择里面的内容,点击开始中的标题1、标题2等, 并将其分别设置为不同级别的标题。 这一步一定要完成不然没法插入目录。 3、然后点击引用-目录,会出现下拉菜单,选择想要插入的目录样式, 当然也可以自定义目录样式,也可…

    2022年9月20日
    18400
  • JavaScript变量or循环中的var和let怎么使用

    在for循环中使用var声明初始化带来的问题 // 一道经典面试题:var funcs = [];for (var i = 0; i < 3; i++) { funcs[i] = function() { console.log(“My value: ” + i) };}for (var j …

    2022年9月15日
    13100
联系我们
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部