- 博客(41)
- 收藏
- 关注
原创 必看,使用Provider优雅解决Riverpod的参数依赖
遇到问题,解决问题是技术人的一个思考准则,当我们遇到丑陋代码时,总可以找到合适的姿势去改变一点,使之优雅好用一点,世界上没有银弹, 但软件开发领域因为不断的进步,也在逐渐的越来越好(至少不想回去做Android原生)。可以把疑问放到评论区,一起讨论。
2024-03-26 20:02:48 791
原创 Flutter中被屏蔽的概念,Scheduler(调度器)
一切皆Widget,良好的底层设计都会屏蔽底层的逻辑,Java如此,Flutter亦是如此,甚至还有开发者面向Getx编程,那么我们可以做如是类比,Flutter是J2EE, Getx是Spring套件,作为Java后台开发,面向Spring开发是不够的,正如,跨平台Flutter 不了解底层机,FLutter底层,FLutter调度原理,Flutter 多线程模型,Flutter帧调度原理
2024-03-25 22:44:55 1157
原创 一篇文章,告别Flutter状态管理争论,问题和解决
状态管理, Flutter, 移动端,我们创造工具,使用工具,改进工具,才有软件的繁荣。不一定非要讨论那个框架或技术有高低差异。在实际开发中,稳定,熟悉是稳定三角的另外两个重要的方面,不同的框架的缺点,总会有一些或者优雅,或者败絮其中的解决方案,在项目中,最重要的适合,合适的工具会让我们开发过程事半功倍,其次是稳定性和学习难度, 不过,一切都需要合适的权衡(trade off)动态的去匹配当下最重要的事。
2024-03-25 09:41:23 1320 1
原创 Flutter开源项目Appflowy学习
Appflowy是一款仿Notion的软件,由两个核心开发人员构成的开源项目,基础是Rust编写业务逻辑,UI由Flutter或其他UI实现.项目地址:https://github.com/AppFlowy-IO/AppFlowy。
2023-12-06 11:06:32 930
原创 1. Appflowy 之 Bloc和freezed,理解Bloc和模式匹配
Flutter 提供了StatelessWidget 处理无状态的UI,StatefulWidget处理有状态的数据,这种分离很好的提供了对不同场景的支持,对于有状态的组件,Flutter开发常见的原生方式是在创建State,将UI剥离出状态,并将状态通过setState()函数重建Widget。如果不做任何分层,仅仅使用Widget,会导致所有的操作,都会在State当中,包括数据的获取,状态的变更,状态依赖的处理。当项目复杂性开始上升,维护项目的成本就会指数级别的增长。或者Rust match。
2023-12-06 11:05:28 545
原创 Android 开发中 常见的数据结构有哪些?
保留了元素的插入顺序,并提供快速查找的操作,使用哈希表存储键值对,同时使用一个双向链表维护插入顺序或访问顺序,具体取决于构造函数的参数。LinkedList 是Java的双链表实现,每个元素都包含前一个和后一个元素的引用,可以高效的在列表中进行插入和删除操作。ArrayList 基于动态数组实现,提供了一个基于数组的,动态增长的列表。是Android 提供的一种优化的数组映射结构,适用于存储稀疏数据,及大多数数据都是默认值。是Java中双端队列的实现,基于数组,并提供了高效的头部和尾部操作。
2023-12-04 23:35:42 1128
原创 从Android面试题目溯源-2、Android为什么要使用Binder机制
Android Binder是一种和Android系统深度绑定的IPC机制,渗透在Android系统从硬件到软件的各个层面。最大程度的可控且适合移动端设备。
2023-11-29 23:48:41 576
原创 从Android面试题目溯源-1、创建线程有那几种方式
回到面试题,线程的创建和管理是开辟一个新的方法栈空间,执行新的函数调用。最初的原因是 IO性能远远低于CPU处理性能,在客户端上的体现是不耗时操作不阻塞主线程(UI线程)给用户提供流畅的体验,近些年来,协程的出现,本质上是Event Loop + 异步编程,轻量级的协程,优化的事件队列,比如Flutter实现的EventLoop由两部分组成。事件队列(Event Queue),存储异步事件微任务队列(Microtask Queue)存储立即执行的异步事件。
2023-11-28 17:12:07 631
原创 声明式UI(Declarative)和命令式(Imperative)UI的差异?
声明式UI(Declarative)和命令式(Imperative)UI的差异?
2022-04-12 20:45:00 3409
原创 LiveData有什么优势?
感知生命周期,不需要activity管理数据,且不会发送数据到不活跃activity数据管理,且最新数据总是被获得组件销毁时,观察者会执行清理
2022-04-09 17:24:32 426
原创 ViewModel解决了什么问题?
Android组件和异步回调声明周期不同步,导致内存泄露configuration changes 导致数据重新获取Activity职责不单一,负责了数据的获取
2022-04-09 16:38:07 196
原创 梳理学习Kotlin,函数式编程
概念: 一切皆可视为函数。与面向对象(OOP),‘一切皆对象’ 相对应 ‘一切皆函数’也是函数式编程的含义。包括经常被形象成为,函数在Kotlin中是一等公民,这句话也是相对OOP编程范式中,方法必须依托类或对象才能存在。对象可以被传递,函数也可以被传递,对象可以作为返回值,函数也可以作为返回值。如何理解Lambda expression 个人理解为,代数方程,函数的输入和输出明确后,方程式就已经定好 y = n * m,对于输入为类型为n, m,返回值为y类型的函数,都可以转换为相同的函数签
2022-04-02 09:59:42 238
原创 梳理学习Kotlin,特殊操作符的用法
空安全fun String.print() { println(this)}val name: String? = nullname?.print()非空安全fun String.print() { println(this)}val name: String? = nullname!!.print()Elvis Operatorval name: String? = nullval show = name ?: "Lucy"show.print()相等判断
2022-04-02 09:58:49 2303
原创 梳理学习Kotlin,Function的用法
示例:main函数fun main(args: Array<String>) {}完整函数fun fib(n: Int): Long { return if (n < 2) 1 else fib(n - 1) + fib(n - 2)}简化返回值函数fun fib(n: Int): Long = if (n < 2) 1 else fib(n - 1) + fib(n - 2)参数带默认值fun fib(n: Int = 5): Long = if (
2022-04-02 09:57:28 2693
原创 梳理学习Kotlin,For Loops的用法
用法// 闭区间for (i in 1..9) println(i)// 左闭右开for (i in 1 until 9) println(i)// 降序,闭区间for (i in 9 downTo 1) println(i)// 步长为 2for (i in 1..9 step 2) println(i)// 降序步长为 2for (i in 9 downTo 1 step 2) println(i)// 枚举集合for (num in listOf(1, 2, 3)) print
2022-04-02 09:56:07 1913
原创 梳理学习Kotlin,when表达式的用法
覆盖案例var maxSurfaceTempIntK: Any = 100fun calcNum() = 600when(maxSurfaceTempIntK) { 700 -> println("Equal 700") 0, 1 , 2 -> println("Equal 0, or 1, etc...") in 20..300 -> println("num in range") !in 300..400 -> println("num
2022-03-30 17:52:11 1095
原创 Tell all the Android application components(简述Android应用组件).
Activity:窗口主体,是四大组件中负责展示与用户交互的组件Service:服务,运行在后台或者前台,提供后台服务和一些前台服务响应BoardCast Receiver: 负责消息通信,有静态很动态注册两种方式Content Provider: 负责跨应用提供公共访问数据...
2021-06-10 20:59:43 111
原创 What is the project structure of an Android Application?(Android项目结构)
AndroidManifest 每个应用或模块都有AndroidManifest.xml,为项目配置文件,配置权限,组件信息等信息。java目录:Java源文件代码存放res目录:应用图片,布局xml等文件存放
2021-06-10 20:59:00 101
原创 What is Context? How is it used?(什么是上下文,如何去使用?)
Context代表了当前应用的状态,可以用于获取应用的资源Context分为两种Application ContentActivity Context两者分别为Application和Activity提供,生命周期是不同的,比如使用单例模式需要context,使用Application Context,生命周期为整个应用。使用Activity Context会导致内存泄露,无法在activity结束后无法被GC回收。...
2021-06-10 20:58:21 697
原创 Android ART和JVM的差异
ART全称是Android Runtime,ART不符合JVM标准,所以不属于JVM,ART基于寄存器的数据结构,是专门为Android系统定制的虚拟机,通过编译工具链将基于栈的Java字节码转换为基于寄存器结构(内存中虚拟出的寄存器)的dex字节码,并通过AOT(Ahead of time)编译技术,安装时通过dex2oat工具,将dex字节码转换为当前设备的机器码,提高了运行效率。Android N:使用AOT编译,解释和JIT对于JIT编译过的方法记录在Profile配置中当设备闲置和充电
2021-06-03 18:31:44 720 1
原创 什么是冯诺依曼计算机体系结构?
存储程序计算机冯诺依曼在论文《First Draft of a Report on the EDVAC》中描述了“处理器”和“存储设备”分开的计算机体系。该体系又被称为存储型计算机,区别于可编程,不可存储的计算机,需要修改电路来进行编程,修改不可存储并再次使用。优势:分开了“中央处理器”和“存储器”,使得计算机走向通用,即不需要通过手动改变电路来进行编程,此后才有更高级的“语言”进行编程。缺点:冯诺依曼瓶颈,因为当代CPU的效率和吞吐量远高于存储设备,导致性能瓶颈(IO瓶颈)...
2021-06-03 16:46:25 776
原创 项目接盘侠复盘总结
写作背景19年3月入职日事清,之前大佬年前撤了去创业,经过几个月的空白期,Android终于落下的一堆需求和山一样的老旧Bug,笔者作为接盘侠,勇敢的打开了上古时代的13款MacbookPro,然后便开始和这台电脑一起开启了无尽的长征。心态要及时调整接盘,回首一年,最重要的是心态要稳住。你无时无刻都在经受精神上的考验,最常见的就是代码你看不懂,你没有任何交接,也没有人参与过你的项目,基本上感...
2020-04-10 11:14:55 598 1
原创 给朋友的Android实用轮子
一些比较好用的轮子语言相对于Java,kotlin现在也相对成熟了,掌握kotlin对目前来说还是很重要的,毕竟更现代化的语言,而且开发速度也会有所提升。混合开发React NativeFlutter官方组件Android官方JetPackconstraintLayout,挺好的ViewGroupAndroid KTX ,kotlin官方扩展包Android Lifecycle...
2020-02-24 15:46:17 339
原创 Android开发者心酸史
Android意外的诞生Android和Linux一样,一个人完成雏形的编码,巨头林立中称之为意外Windows MobileWindows Mobile是微软针对移动产品而开发的精简操作系统Pocket PC 20002000年4月19日Mobile 6.52009年2月发布[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sd43yzuw-1575...
2019-11-29 16:22:27 2010
原创 程序员思维修炼: 开发认知潜能的九堂课
程序员思维修炼: 开发认知潜能的九堂课一个人痛苦的时刻也许是迷茫和走不出迷茫,我找到这本书是因为我在自己的职业生涯迷失了自己,有人曾说,你不需要将伟人作为目标,他只能是他,而你永远不会成为他,能促使我们不断进步的大多数时候是身边的强者,能看到他的身影,想追上他的步伐。现在我又开始了独立开发,这注定是一条寂寞且容易迷失的路,我很慌张,因为失去了目标就会陷入深深的无聊,所以我找了很多书来读,希望能...
2019-11-29 16:21:02 610
原创 阅读笔记–Java 8函数式编程,建议看书,作者高屋建瓴
阅读笔记–Java 8函数式编程书籍代码为什么需要再次修改Java1996年1月,Java1.0发布,商业发展需要更复杂的应用,跑在功能强大的多核CPU机器上。带有高效运行时编译器的Java虚拟机的出现,使程序员将更多的精力放在编写干净,易于维护的代码上,而不是思考将每一个CPU时钟周期,每字节内存物尽其用。多核CPU,涉及锁的编程算法不但容易出错,而且耗费时间。 java....
2018-08-09 17:56:23 598
原创 Android面试
面试时间较短,要考虑到各个方面1、请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。 拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中,接着调用Looper.loop()不断遍历MessageQueue,Handler的创建依赖与当前线程中的Looper,如果当前线
2017-07-05 19:34:58 353
原创 Java面试题带答案
面试别人真是一个痛苦的过程,自己整理了一些短时间内考察的问答题(非笔试)Java基础1, String 是最基本的数据类型吗? 不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference
2017-07-05 19:31:47 390
翻译 Reactive Programming with RxJava,介绍一本书和Rx
Reactive Programming with RxJava,介绍一本书和Rx标签(空格分隔): book RxJavaWho Should Read This BookReactive Programming with RxJava targets intermediate and advanced Java program- mers. You should be fairly comfo
2017-05-08 10:20:32 1454
原创 Android 7.0新特性
Android 7.0新特性Android: 7.0 行为移除三项隐式广播Android 7.0 移除了三项隐式广播CONNECTIVITY_ACTIONACTION_NEW_PICTURE ACTION_NEW_VIDEO为缓解这些问题,Android 7.0 应用了以下优化措施:面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清
2017-03-24 20:16:08 880
原创 Android特殊字体引入,以及描边和投影
Android特殊字体引入,以及描边和投影标签(空格分隔): Android 字体 描边这篇文章并非纯原创,因为项目原因,忘记记载出处,还望原作者海涵。主要功能就是实现了特殊字体的描边字体文件放在Asset文件夹中 public class GoldTextView extends TextView { TextPaint m_TextPaint; int mInnerColor;
2016-12-09 20:11:35 1441
原创 Android微信登录(shareSDK)注意事项
Android微信登录是个坑(shareSDK)标签(空格分隔): shareSDK 微信登录 Android第三方登录,只有微信是最麻烦的东西,之所以说麻烦是官方文档写的真的,网上的各种demo虽然能跑,但是却总有一些小问题注意不到。首先,注册微信的开发者帐号,注意先生成Key文件,打包,然后再去获得微信需要的两个值。检查工具 下载检查工具 微信包的位置,写法要严格 <activity an
2016-12-09 19:44:51 5721 2
原创 关于DialogFragment的一些学习
关于DialogFragment的一些学习标签(空格分隔): DialogFrgment经历了一个月的项目期,Google给我的最好礼物莫过于谷歌官方网站了 点击进入Google官网DialogFragment介绍自从Fragment时代的到来,任何View都可以封装到一个Fragment中,然后代替原来的固定的布局模式;DialogFragment因为继承于Fragment并封装了一个Dialo
2016-12-09 18:55:01 816
原创 View基础知识
VIew的位置参数top: 左上角的纵坐标left: 左上角的横坐标right: 右下角的横坐标bottom: 右下角的纵坐标Attention: View在平移过程中,top和left表示的是原始左上角的位置信息,不改变,改变的是x, y, translationX 和 translationY;View的实现@UiThreadpublic class View implements
2016-10-28 14:12:39 360
原创 Android前台Service
前台Service标签(空格分隔): Service androidService默认是运行在后台的,在内存比较紧缺的时候,容易被回收。所以可以将Service设置为前台Service。下面是具体实现。public class WeatherService extends Service { @Override public void onCreate() { sup
2016-10-28 11:48:10 527
原创 单元测试和Mock方法
单元测试和MockService标签(空格分隔): 协作开发 虚拟接口 Android单元测试首先是开发的一部分,目的是保证没有耦合的情况下任何输入都能保证正确的输出(包括异常),可以保证程序的健壮性,避免代码腐烂化。其重要性是不言而喻的。查找了一些在Java中的测试思想以及测试工具,整理一下思路。在单元测试时,测试人员根据详细设计说明书和源程序清单,了解到该模块的I/O条件和模块的逻辑结构,主要采
2016-10-26 21:21:12 3507
原创 读书笔记App研发录--数据缓存设计
读书笔记App研发录–数据缓存设计标签(空格分隔): 数据缓存 android 优化数据缓存策略在2G和3G网络状态下,MobileApi访问速度过慢,会导致不好的用户体验。网络端的数据接受的限制主要是传输速度的限制。 策略减少MobileApi的调用次数App缓存时间。分时间段调用,一段时间使用缓存数据App缓存只使用于数据即时性要求不高的数据。当然也可以根据具体的需求调节App缓存时间
2016-10-24 17:34:06 447
原创 Android图片加载框架Fresco解析
Android图片加载框架Fresco解析标签(空格分隔): Android 框架 图片与ImageLoader不同,Facebook的开源框架的加载方式决定了,更低的内存使用,更高的可定制性。Fresco原理设计一个Image Pipeline的概念,负责先检查内存,磁盘文件,如果都不存在则从给的Url中下载。 Fresco有三个线程池,其中,三个线程用于网络下载图片,2个线程用于磁盘文件的读写
2016-10-24 13:44:48 718
原创 App研发录第二章
读书笔记–App研发录Http和HttpUrlConnection的用法标签(空格分隔): Android HttpUrlConnection 异步网络请求过程HTTP是一种应用层协议,他通过TCP实现了可靠的数据传输,能够保证数据的完整性,准确性,TCP的优点使得HTTP的数据传输吞吐量和效率得到保证。 移动开发多为C/S架构,客户端向服务端发送特定请求,服务器返回结构,客户端解析结果,再进
2016-10-21 13:11:43 432
原创 读书笔记----App研发录 第一章 重构
读书笔记—-App研发录 第一章 重构 对代码的重构,本质上遵循了六大设计原则。这是编码的根本准则,只有遵循这些准则,才会让代码避免恶化的脚步。拥有更好的扩展性,易读性和便于维护。这是一个良好项目的开始。
2016-10-20 14:32:56 520
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人