kotlin协程实战:用协程和DSL一键实现拍照和相册功能 - Go语言中文社区

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


拍照和相册选择在不少项目中使用频率都较高,写起来感觉难度也不大,但最近我在项目中集成这个功能的时候却遇到了不少问题,比如存储目录的选择,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

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/cc177cf32d8e
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:03:31
  • 阅读 ( 1481 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢