D&JのZONE

知之者不如好之者,好之者不如乐之者

TCP协议在面试过程中被提问频率也是很高的,但每次被问也都只能粗略几句话便说完,本文则是为了记录和巩固下对TCP协议中3次握手过程的理解...

阅读全文 »

现在移动端跨平台技术慢慢成熟,而Kotlin的KMM解决方案则在双端UI上实现都是原生,而共享业务逻辑代码,流畅度无疑是最接近原生的。本文主要是对自学KMM项目的一次总结和问题记录...

阅读全文 »

移动应用开发中,本地文件存储基本都会被用到,作为一个Android开发者,在KMM项目中遇到发现读取文件时拿到空结果,但是通过验证文件确实是存在的。通过一番努力之后,也算发现问题原因并解决了。写下本文记录简单的过程。

阅读全文 »

在Compose中,UI界面组件是通过重组更新UI,而重组则是重新执行Composable函数来实现,与其对应的是跳过重组来避免Compsable函数执行从而达到性能上提升。所以如果我们在某一个界面持有一个比较大的状态,状态的任意属性的改动都将引起整个界面重组,因此在必要的情况下我们可以拆分状态来减少重组域,提升性能...

阅读全文 »

在Jetpack Compose 代码中,我们经常看到LaunchedEffect这个常见的。今天就简单了解下这个方法吧。在说LaunchedEffect前,让我们先说一下Side Effect.

什么是Side Effect

在编程语言中,Side-Effect指的是调用函数时,除了返回可能的函数值外,该函数还对函数范围外的变量,参数等进行了修改。
举个🌰,看下面的函数,它有2个参数,返回它们的和,但是没有对任何其他变量有修改,所以它是没有副作用(No Side-Effect)的

fun sum(number1: Int, number2: Int) = number1 + number2

但如果我们将函数修改成下面的实现,每次调用该函数都会对sum重新赋值,而sum又是在函数范围外,所以认为这个函数有一个副作用

var sum = 0
fun sum(number1: Int, number2: Int) {
    sum = number1 + number2
}

在Jetpack Compose 中,什么是LaunchedEffect

根据源码我们看到,LaunchedEffect是一个带有@Composable的函数,注释如下

阅读全文 »

Android 跨进程通信的方式一般有:

  1. Binder
  2. 内存共享
  3. Socket

其中Binder在Android中使用比较多,比如AMS
在Android上,一个进程通常是不能获取到其他进程的内存访问权限的,但是有时我们需要在多个进程之间进行数据处理,因此Android提供了Android Interface Definition Language(AIDL)来做处理
其实AIDL是文件会通过编译生成一个Sub类并实现IBinder接口的,这种方式可以说是基于Binder实现的。

配置新项目

首先创建一个项目,有两个Phone Module,分别为Client和Server端。对于新的项目打开aidl feature支持

buildFeatures {
    compose true
    aidl true
}
阅读全文 »

因为将项目从Retrofit切换到Ktor和gson切换到kotlinx serialize。而kotlinx serialize和gson的实现差异导致在rpc接口中对于rpc 请求参数类型不一致的情况下,序列化出现了异常报错,比如类似一下的请求Body

{
    "id": 0,
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [
        {
            "data": "0x5ec88c7900000000000000000000000081080a7e991bcdddba8c2302a70f45d6bd369ab5",
            "from": "0x81080a7e991bcDdDBA8C2302A70f45d6Bd369Ab5",
            "to": "0xb3831584acb95ED9cCb0C11f677B5AD01DeaeEc0"
        },
        "latest"
    ]
}

List<Any> + @Contextual

本来以为在Kotlinx Serialize上会像Gson一样轻松解决,一开始便对于原来的数据结构定义成

阅读全文 »
0%