首页 > 其他分享 >kotlin协程原理分析项目实战

kotlin协程原理分析项目实战

时间:2023-06-19 10:37:10浏览次数:65  
标签:实战 协程 请求 fragment kotlin 代码 startActivityForResult 权限


自从6.0加入动态权限之后,很多地方都要用到,开始的时候使用的原生代码写权限请求,代码格式如:

if(应用是否已经请求了该权限组){
    权限请求后的代码
}else{
    请求权限
}

然后不知道在fragment或是activity里面重写

override onRequestPermissionsResult{
    if(请求成功){
        权限请求后的代码
    }else{
        失败处理
    }
}

不知道你们对这种代码是什么感觉,反正我是很不喜欢这样的代码,和不喜欢startActivityForResult还有handle一样,由于今年来rxjava大火,我首先想到的是能不能用rxjava来封装,果然,git上一搜,就搜到RxPermissionsRxStartActivityForResult这两个项目,这种写法优化了原生代码那种离散的写法,增加了代码的可读性,代码变为

new RxPermissions(activity)
    .request(权限数组)
    .subscribe(){
        if(权限请求成功){
        {
    }

瞬间简洁了不少,不过考虑到我的很多项目都接入了协程,也觉得协程的顺序写法可读性简洁性和可维护性都更强,希望能够找到请求权限的协程解决方案,在网上找了很久也没找到相关方案,找startActivityForResult的时候却找到了startActivityForResult的协程解决方案InlineActivityResult,于是参考了他的设计思想,最终实现了动态权限请求的协程写法,用kotlin协程实现动态权限请求

用法很简单:

CoroutineScope(Dispatchers.Main).launch {
    try {
        requestPermissionForResult(*permissions)//权限请求
        权限请求成功后执行的代码
    }catch (e: InlineRequestPermissionException) {
        权限请求失败后执行的代码
    }
}

因为语法要求,所以在执行权限请求前要先开启一个协程CoroutineScope(Dispatchers.Main).launch,因为是在Activity或是fragment中请求,所以最好在协程中指定主线程Dispatchers.Main

trycatch是因为要处理权限取消或是权限请求失败后的流程,也可以在设计的时候集中处理权限请求失败后的流程,这样就可以不用写trycatch,这就涉及到协程的异常处理了

CoroutineScope(Dispatchers.Main).launch {
    requestPermissionForResult(*permissions)//权限请求
    权限请求成功后执行的代码
}

另外trycatch也可以和其他协程共用,这样trycatch就不是专门为某个协程而生了

CoroutineScope(Dispatchers.Main).launch {
    try {
        requestPermissionForResult(*permissions)//权限请求协程写法
        权限请求成功后执行的代码
        val result=startForResult(activity)//startActivityForResult协程写法
        startActivityForResult返回代码
    }catch (e: InlineRequestPermissionException) {
        权限请求失败后执行的代码
    }catch(e: InlineRequestPermissionException){
        startActivityForResult返回异常处理
    }
}

实现原理也不复杂,思路是请求权限的时候在Activity中创建一个无界面fragment,提交fragment事务的时候不要提交到回退栈(commitNowAllowingStateLoss),在该fragment中重写onRequestPermissionsResult方法接收请求结果,完毕之后移除fragment事务,然后用协程封装方法封装;这样做的好处是整个权限请求过程和原请求的Activity/Fragment解耦,无需关心请求过程,也无需重写onRequestPermissionsResult去接收请求

无界面fragment提交事务方式:

activity.supportFragmentManager
        .beginTransction()
        .add(fragment,Tag)
        .commitNowAllowingStateLoss()

无界面fragment移除

fragmentManager.beginTransaction().remove(this).commitAllowingStateLoss()

最后用协程封装

kotlin协程原理分析项目实战_kotlin

当然原理还是比较简单,实现过程也不算复杂,这是项目地址:用kotlin协程实现动态权限请求


标签:实战,协程,请求,fragment,kotlin,代码,startActivityForResult,权限
From: https://blog.51cto.com/u_16163480/6511273

相关文章

  • 从入门到精通,Android Jetpack 架构实战教程合集
    Jetpack是Google推出的一些库的集合,包含组件、工具、架构方案等,其优势众多:可以减少空指针异常崩溃、内存泄漏,为开发出健壮且流畅的程序提供强力保障;可以消除大量重复样板式的代码,加速Android的开发进程;可以统一开发模式,抛弃传统的MVC,MVP…对于谷歌而言,AndroidJetpack是他......
  • 用kotlin来开发一个cli工具 | 没用的技能+1
    脚手架脚手架是为了保证各施工过程顺利进行而搭设的工作平台而在程序开发过程中,每个工程或者说公司也都需要一个脚手架工具。通过脚手架命令行的形式简化开发流程,避免发生一些人为的相对低级的问题,所以这个也就是为什么叫做脚手架的原因吧。而由于每个公司的代码规范都不同,一般情况......
  • 在 Debian 12 上安装 KubeSphere 实战入门
    老Z,运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及Kubernetes、KubeSphere、DevOps、OpenStack、Ansible等。前言知识点定级:入门级KubeKey安装部署KubeSphere和KubernetesDebian操作系统的基本配置Kubernetes常用工作负载的创建KubeSphere......
  • RBAC实战-配置用户操作集群权限(二)
    生成私钥cd/etc/kubernetes/pki(umask077;opensslgenrsa-outlucky.key2048)生成证书请求opensslreq-new-keylucky.key-outlucky.csr-subj"/CN=lucky"生成luckyca证书,获取APIServer信任opensslx509-req-inlucky.csr-CAca.crt-CAkeyca.key-CAcreatese......
  • GreenPlum分布式集群部署实战
    文章目录前言......
  • Netty实战(十六)
    (UDP广播事件(二)编写广播者和监视器)一、编写广播者Netty提供了大量的类来支持UDP应用程序的编写。下面我们列出一些要用到的类型:名称描述interfaceAddressedEnvelope<M,AextendsSocketAddress>extendsReferenceCounted定义一个消息,其包装了另一个消息并带有......
  • Vue实战(09)-列表渲染:让你的页面秒变爆款!
    1最基础的循环<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Vue中的列表渲染</title><scriptsrc="../vue.js"></script></head><body>......
  • 【人工智能】国产开源大模型聊天 AquilaChat 快速开始上手实战&效果评测
    【人工智能】国产开源大模型聊天AquilaChat快速开始上手实战&效果评测文章目录【人工智能】国产开源大模型聊天AquilaChat快速开始上手实战&效果评测禅与计算机程序设计艺术:评测结论——AquilaChat在写作水平上跟ChatGLM-6B差不多,但是AquilaChat多编程语言写代码能力还是......
  • TensorFlow05.3 神经网络-FashionMNIST实战
    一.数据的加载:(x,y),(x_test,y_test)=datasets.fashion_mnist.load_data()print(x.shape,y.shape)二.数据的处理defpreprocess(x,y):x=tf.cast(x,dtype=tf.float32)/255.#归一化y=tf.cast(y,dtype=tf.int32)returnx,y batchsz=128db......
  • Zookeeper入门实战(5)-分布式锁
    在分布式环境中,当需要控制对某一资源的不同进程并发访问时就需要使用分布式锁;可以使用 ZooKeeper+Curator来实现分布式锁,本文主要介绍 Curator中分布式锁的使用,文中所使用到的软件版本:Java1.8.0_341、Zookeeper3.7.1、curator5.4.0。1、引入依赖<dependency><groupId......