美文网首页kotlin
kotlin协程实战:用协程和DSL一键实现拍照和相册功能

kotlin协程实战:用协程和DSL一键实现拍照和相册功能

作者: 海本默 | 来源:发表于2019-11-05 17:45 被阅读0次

    拍照和相册选择在不少项目中使用频率都较高,写起来感觉难度也不大,但最近我在项目中集成这个功能的时候却遇到了不少问题,比如存储目录的选择,uri各种版本的不同与兼容,uri与文件以及bitmap的转换以及兼容,系统裁剪页面与url的冲突等等问题,这些细枝末节的问题搞了我几天才搞清楚,网上也找了几个开源框架,发现也无法满足开发中的需求,于是想到用kotlin,协程,dsl,函数式编程来写一个框架,可以一键实现照片和相册功能,不用去关系uri,bitmap等细枝末节的问题

    先说用法,集成aar,这里是项目地址https://github.com/diao-jian/OneKeyPhoto

    用法

    采用dsl的调用方式,photoAndAblum为打开弹出框,getPhotoResult为等待返回结果,调用代码比较简单,无需考虑权限,还有onActivityResult,都用协程封装好了

    既然为dsl写法,就要体现出他的优势

    dsl配置裁剪字段

    如上图,可以增加isCrop字段来控制图片是否裁剪,当然目前只有少量功能,如果需要扩展功能,可以在主类里增加字段,然后在调用的时候去配置,大大增加了程序的可扩展性

    同时也可以使用kotlin的解构声明特性,选择性的使用参数,同时也屏蔽了PhotoReult数据类

    解构声明写法 界面效果

    用法介绍完了,说下设计思路,主类是一个dialogfragment

    最外层调用的photoAndAblum方法,是FragmentActivity的扩展方法,传递一个函数参数,并且这个函数参数为主类的扩展函数,这样就是典型的dsl写法,如下图:

    请求权限和startActivityForResult的时候采用的都是协程写法,请求权限成功执行请求下面的代码,若请求失败则抛出异常,实现原理是在activity下创建一个无界面fragment,采用不提交回退栈的方式提交事务,请求成功之后移除fragment

    请求权限协程 startActivityForResult协程,不用再去写onActivityForResult了 无界面fragment要用commitAllowingStateLoss提交,不让他提交到回退栈

    这种用协程的写法有两个优点

    一是代码可以顺序执行,可以少嵌套一层,所有变量都是平级的,可以互相调用,如果用回调,回调后的代码是封闭的,不能让外界调用,二是关系紧密的代码可以写到一起,排查问题的时候也容易找到,比如像startActivityForResult,你调用的时候可能在onCreate里调用,回调的时候要到onActivityResult里去找,甚至有些时候,你在Fragment里去调用startActivityForResult,要到activity里面去回调,所以每次写startActivityForResult的时候就感觉很头疼

    最后再次附上项目地址,欢迎指正:https://github.com/diao-jian/OneKeyPhoto

    相关文章

      网友评论

        本文标题:kotlin协程实战:用协程和DSL一键实现拍照和相册功能

        本文链接:https://www.haomeiwen.com/subject/puvjbctx.html