让 Compose 路由用的更舒服的两个小技巧
在以前不使用 Compose 的时候,我们通常使用 Activity 作为一个单独的页面,页面跳转只需要调用 Context.startActivity(),页面关闭调用 Activity.finish(),非常的简单。但在 Jetpack Compose 中,推荐使用单 Actiivty 模式,即所有的页面都在同一个 Activity 中,所以会用到路由框架 Jetpack Navigation。不得不说这个 Navigation 真的用的不是很习惯,踩了很多坑。下面是踩坑两个小技巧让写 Compose 路由更舒服。
技巧一:NavHostController 的 “本地化”为什么我们在所有的Compose函数中都可以拿到 Context、Density 呢?因为 Compose 框架默认给它们做了 “本地化”处理。“本地化”处理之后,我们可以在任意 Compose 函数中使用 Localxxx.current 获取到它。我们来试着依葫芦画瓢实现一个 LocalNavHostController。我们点开 LocalContext 的源码。
123val LocalContext ...
BASE62编码
BASE62编码由a-z、A-Z已经0-9组成,相较于BASE64编码由更好的兼容性。为什么说具有更好的兼容性呢?因为BASE64编码后的文本中含有’/‘、’=’等具有特殊意义的字符,在文件名或URL参数等场景中会造成冲突。
那为什么URL参数为什么不使用URL编码呢?因为使用Java的URLEncoder编码在使用URLDecoder解码后在某些特殊的场景下编码后可能出现与原值不一样的情况。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321 ...
Kotlin协程标准函数
标准函数 suspendCoroutineKotlin协程标准函数实现:
12345678910111213141516171819202122232425suspend fun requestGit() : String { return suspendCoroutine<String> { coroutineContext -> thread { val callFactory: Call.Factory = OkHttpClient() val request = Request.Builder() .url("https://api.github.com/user") .get() .build() try { val call = callFactory.newCall(request) ...
Kotlin协程
概念协程的概念最核心的点就是函数或者一段程序能够被挂起,稍后再在挂起的位置恢复。
挂起和恢复是开发者的程序逻辑自己控制的,协程是通过主动挂起出让运行权来实现协作的,因此它本质上就是在讨论程序控制流程的机制,这是最核心的点,任何场景下探讨协程都能落脚到挂起和恢复。
协程与线程最大的区别在于,从任务的角度来看,线程一旦开始执行就不会暂停,直到任务结束,这个过程都是连续的。线程之间是抢占式的调度,因此不存在协作问题。
挂起恢复。
程序自己处理挂起恢复。
程序自己处理挂起恢复来实现程序执行流程的协作调度。
因而协程的实现也可以按照是否开辟相应的调用栈来分类。
有栈协程(Stackful Coroutine):每一个协程都有自己的调用栈,有点类似于线程的调用栈,这种情况下的协程实现其实很大程度上接近线程,主要的不同体现在调度上。
无栈协程(Stackless Coroutine):协程没有自己的调用栈,挂起点的状态通过状态机或者闭包等语法来实现。
Kotlin的协程通常被认为是一种无栈协程的实现,它的控制流转依靠对协程体本身编译生成的状态机的状态流转来实现,变量保存也是通过闭包语法来实现 ...