- 博客(81)
- 资源 (3)
- 收藏
- 关注
原创 Java Stream:让你的集合操作如丝般顺滑
filter(Predicate predicate) 对流中的元素进行筛选,只保留符合条件的元素。map(Function mapper) 对流中的元素进行映射操作,将每个元素映射成一个新的元素。) 对流中的每个元素进行映射操作,将每个元素映射成一个新的流,并将多个流合并成一个流。distinct() 去除流中的重复元素。sorted() 对流中的元素进行排序操作。limit(long maxSize) 对流进行截取操作,只保留前n个元素。
2024-01-08 15:03:04 427
原创 空间换时间-五秒出解:从900ms到5ms的幕后优化大揭秘!
探索数据操作的效率是软件开发中的一项重要任务。开发中遇到了Java中的`ArrayList`和`removeAll`方法,意外发现当面对大量数据时,其执行效率可能会让人瞠目结舌,高达900毫秒以上!然而,通过一系列分析和优化实验,我成功将执行时间从900ms优化到令人惊叹的5ms以内。
2024-01-05 10:14:05 926
原创 缓存优化必备掌握冷热分离和重排序的优化技巧
玩儿东西还是要弄明白这个东西的成立基础是什么,或者负面因素有哪些。需要有足够的数据支持冷热分离和重排序,否则这些优化可能不会带来明显的性能提升,甚至可能会造成额外的开销。冷热分离和重排序的实现需要考虑数据的生命周期,避免数据被错误地缓存或销毁。冷热分离和重排序可能会导致数据的展示顺序不符合用户的期望,需要进行适当的处理,以保证数据的展示效果。在实现时需要考虑多线程安全问题,避免因并发访问导致的数据错乱或其他异常情况。
2023-03-11 08:15:30 430
原创 Retrofit + OkHttp3 + coroutines + LiveData打造一款网络请求框架
一个好的网络框架需要有那些特点呢?请求当然这个请求不单单是发送请求这么简单,它包括请求相关的一系列配置是否简易、发送模式是否灵活切换、请求头信息是否易处理、请求参数是否易操作等等响应一个好的网络请求框架肯定需要提高我们的生产力,保证我们程序的健壮性,那么响应体和这些又有什么关系呢?容易转换成不同需求的实体是否能返回不同类型的结构。xml、json、text等等总的来说就是易使用、易扩展、可读性高一、目的背景市场上现在存在的网络请求不在少数,从原生的HttpClient 到.
2020-08-11 17:31:29 1558 4
原创 两万字长文-最全的线程池详解
int corePoolSize, // 核心线程数:线程池中始终保持存活的线程数,即使它们处于空闲状态。int maximumPoolSize, // 最大线程数:线程池中允许的最大线程数。当队列满了并且当前线程数小于最大线程数时,会创建新的线程来处理任务。long keepAliveTime, // 线程空闲时间:非核心线程的空闲时间超过这个时间,就会被回收。指定数值和时间单位一起使用。
2024-03-07 16:37:11 991 1
原创 设计模式巡礼:多板适配案例解析与深度重构
通过对现有代码的分析和重构,我们解决了原有代码存在的问题,提高了系统的可维护性、可扩展性和可读性。使用抽象工厂模式和适配器模式,使得系统更加灵活,业务概念更加统一,业务代码与底层SDK的实现解耦。这样的设计不仅适应了当前的业务需求,还为未来的扩展和变化提供了良好的支持。在实际开发中,重构是一个不断演进的过程,需要根据实际情况灵活运用设计模式和原则,不断优化和改进代码结构。同时,良好的文档和规范也是团队协作的重要保障,能够使团队成员更加容易理解和使用不同板子的SDK。
2024-02-07 12:52:08 1625 1
原创 被设计的面试题与设计性的回答
不知不觉中,身边的Android 开发同事都已经变成了5年以上的老兵了,并且公司递过来的简历也都是五年以上的。这种情况下里描述的行为价值已经是必备项目了,那怎么简单的考察面试者的基础设计能力,这就是个问题了。如果简单的问常见的设计模式,就没意义了,一般情况下招过来的人,他们也没有机会写项目架构的搭建,所以问常见的或者面试热门的架构问题就不行了。在面对设计性的面试题时,我们需要展现出对系统架构和设计模式的深刻理解,而不仅仅停留在表面的知识点上。
2024-02-05 08:54:15 860
原创 Kotlin Collection KTX:让你的集合操作如丝般顺滑
当今移动应用开发,常常需要使用各种集合类型来存储和操作数据。Kotlin 提供了 Collection KTX 扩展库,为我们操作集合提供了非常方便的 API。在本篇文章中,我们将介绍 Collection KTX 中包含的所有扩展函数,让你的集合操作变得更加高效、简单、易读。除了 Collection KTX,Kotlin 还提供了许多其他扩展库,例如 Android KTX、Coroutines、Serialization KTX 等,它们都可以大大简化我们的开发流程。
2024-01-10 10:41:47 1019
原创 UI自动化测试革命:拥抱Maestro框架的未来之旅
本文深入探讨了UI自动化测试及其在软件开发中的重要性,并介绍了几个常见的UI自动化测试框架,如Selenium、Appium、Cypress和TestComplete。其中,特别重点介绍了基于这些框架的强大工具——Maestro框架。Maestro框架为开发人员提供了一套全新的语法和工具,使他们能够更轻松地创建、管理和执行UI自动化测试脚本。安装和配置Maestro框架是使用该框架的关键步骤之一。在本文中,我们提供了详细的指南,指导读者如何轻松地安装和配置Maestro框架,为其工作环境搭建坚实的基础。
2024-01-10 10:36:52 1213
原创 如何衡量一个排序算法的性能
这是八股文的知识,但是中国人又个好的习惯,当别人给你一块好吃的面包时,你总想知道这个面包是怎么做的,对于目前的IT行业来说,不管这个做法你是被动的学习还是主动的探索,你都要知道,也必须要知道。高端的面试,往往不会直接让你写代码(我经历过一个面试,要求纸上写一个图的数据结构,这可能和我简历中的一条有关,但是一般情况下,我认为这个思想重于实践,并且实践的复杂程度纸上是写不出来的),有经验的面试官会给你算法,但是重点是考虑你的思路和对模式算法套路的理解,即应用。
2024-01-08 13:55:59 1154 1
原创 匿名内部类为什么泄漏,Lambda为什么不泄漏(案例不涉及持外部引用的情况,即:只分析匿名内部类和Lambda内部类情况)
在Android开发中,内存泄露发生的场景其实主要就两点,一是数据过大的问题,而是调用与被调用生命周期不一致问题,对于对象生命周期不一致导致的泄漏问题占90%,最常见的也不好分析的当属匿名内部类的内存泄漏
2024-01-05 10:04:49 1090 1
原创 打造强大的Android C++工程
Android系统🈶️C++ 语言开发的原因,每个 Android开发者都或多或少的涉及过一些C++ 的开发,但是作为一个常年开发Android的人来讲,开发C++时变得不合乎常理,总感觉写的东西就是一个Demo,或者不知道怎么在工程中开发C++。
2024-01-05 10:02:37 585
原创 Android 组件化代码中心化问题之.api化方案
theme: channing-cyanhighlight: a11y-light一、代码中心化问题将一个大型的项目拆分成多个Module或者新开的组件化项目,想要的预期是这些module之间是平级的关系.这样一来就可以使得业务相对集中,每个人都可以专注在一件事上。同时,代码的耦合度也会随之降低,达到高度解耦状态,因为同级的module不存在依赖关系,在编译上就是隔离的,这会让组件间的依赖非常清楚,同时也具有更高的重用性,组件强调复用,模块强调职责划分。 他们没有非常严格的划分。达到可复用要.
2021-09-09 17:08:37 552
原创 组件化依赖管理办法
theme: channing-cyan在组件化过程中,面临着非常多的复用、切换等场景,对于组件化中的dsl文件,也可以尝试将其组件出来,更好的复用、更好的管理。一、利用buildSrc + .buildscript 对dsl 文件进行组件化1.1 buildSrcbuildSrc 一种可以利用kotlin DSL + kotlin 语言来充当groovy 中ext的操作方式,Android Studio 可以自动在项目根目录中形成可依赖的文档,届时我们可以利用它来管理版本号,依赖以及提供一.
2021-09-09 17:07:44 406
原创 依赖注入及小型项目中网络框架的使用(结合Dagger2)
依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。符合单一指责原则以及开闭原则什么是依赖注入类通常需要引用其他类,eg: Car 类可能需要People 类,这些类称为依赖项,Car 依赖于People 才能运行以前在Android开发中用到的依赖注入不是很多,知道最近看了几个项目包括写了几周Java项目,才注意到以来注入的方式在现有技术中的地位,在Java Spring Boot 中几乎将依赖注入用到了极致,减少了太多的工作量优势.
2020-09-02 14:38:27 273
原创 Android技术控固
由于公司原因,从当时的Android开发先转向了web开发,现已一年有余,期间对于Android技术的热爱,一直在学习、练习,从Java到kotlin,从基础到专项(原理性),包括网络框架、框架组合、jetpack新秀的学习、使用,今天要分享的这个项目是一个图片浏览项目,很简单的列表展示,但是里面设计到了很多的知识,足够概括开发的问题设计技术:kotlin语言kotlin 的一些使用技巧jetpackretrofitdagger2Android 常用型项目组织架构其他项目地址:I.
2020-09-01 15:36:45 200
原创 Android 优雅的处理是否jump逻辑
在项目开发中我们都会遇到判断是否登录、是否是会员、是否有数据等等,不唯一跳转路径的业务,这种业务有个优点就是好写,确定就是需要写的多。那写的多能算一个缺点吗? 也不算,但是对于代码的刻度性来讲,一个方法一点击引用处,出现几十处,总归不是很好的,我们需要将这些简单的功能精简化是不是很简单的一个逻辑,反手就写出来了// UserUtils:fun isLogin(user: User) :Boolean{ return user.xx == null}然后呢?然后当然是使用了// .
2020-08-31 16:15:02 285
原创 在项目中优雅的使用ViewModel
ViewModel 是jetpack(Google 提供的应用开发框架)中的解耦数据和UI,可感知生命周期的方式存储数据,可以随着Activity的生命周期进行数据的控制,解决了以前Activity的切换横竖屏重新加载数据等问题,但是ViewModel 最主要的不是保存短在的数据在其属性中,而是通过它进行数据与UI的无感知更新,一、ViewModel 的生命周期ViewModel 存在的时间范围是获取ViewModel 时传递给ViewModelProvider的Lifecycle,而后ViewMo.
2020-06-17 15:18:13 2049
原创 中介者模式下的Android底部导航栏
Mediator Pattern: 中介者模式, 用一个中介对象来封装一系列的其他对象的交互,使各个对象不需要显示的相互调用,使其耦合松散,降低多个对象类之间的通信复杂性。详细流程以后补充, 有点忙,代码上传了 代码非常好理解,从字面意思中就能明白什么是中介者模式,那么对于Android底部导航栏有很多种实现方式,为什么还需要自己去设计呢?并且是使用中介者模式,典型的简单功能复杂化,是这样吗?答案肯定是不。从入行程序开发开始,就或听或写各种开发模式,开发模式能提升开发效率,扩展性、易维护等等,.
2020-06-16 16:48:13 212
原创 Android NDK开发基础篇(二)
此系列记录Android NDK基础开发知识,在Android NDK开发基础篇(一)中介绍了NDK、JNI以及关系,包括AS创建JNI的项目及第一个函数解析,目的Java类型和native类型的映射关系jobjectjclassJNIEnv 的基本使用用于参数解析:Java_com_kpa_jnijavademo_MainActivity_stringFromJNI( JNIEnv *env, jobject obj/* this */) { .
2020-05-28 19:47:33 209
原创 Android NDK 开发总篇
一、Android NDK 开发原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 Activity 和访问实体设备组件,— 官网进一步提升设备的性能,以降低延迟或运行计算密集型应用,比如处理游戏、处理图片模糊使用其他人开发的C/C++库,比如软硬件结合开发的,以软件控制硬件驱动(当然移动端处理比较少 大多数是后台处理,但是也不能否认一些定制类型的APP需要用到)Android的SDK都是Java
2020-05-25 12:39:27 311
原创 Android NDK开发基础篇(一)
一 概念NDK (Native Development Kit),NDK是Google开发的一套开发和编译工具集,可以生成动态链接库1.1 NDK与JNI的关系JNI (Java Native Interface), java 本地化接口,可以通过JNI调用系统提供的API、操作系统(不管什么系统底层都是使用C/C++作为驱动的),Java在在运行时需要编译成虚拟机可以运行的class字节码,然后在由虚拟机编译成机器码,而C/C++可以直接编译成机器码,所以效率上Java不如C/C++,
2020-05-25 12:38:20 760
原创 编译插桩利用ASM 插入字节码
使用ASM,插入字节码到Activity文件简单记录一下ASM在此需求中的实现插入字节码一、 ASMASM 是一个Java字节码操控框架, 可以用来改变或者增强现有类的功能,可以通过解析.class文件中的字节码,经过一些处理,生成新的字节码1.1 在这里仅完成需求,需要主要的几个类:ClassReader 负责解析 .class 文件中的字节码,并将所有字节码传递给 Cla...
2020-04-28 15:23:51 992
原创 编译插桩-Transform
自定义好gradle之后,需要实现遍历class文件的逻辑,拿到所有的.class文件之后才能做之后的工作, 然而这部分的功能主要靠transform API 实现Transform简单来讲,Transform 是Gradle在编译项目时的一个task,在.class 文件转换成.dex的流程中会执行这些task, 很明显,.class文件转换为.dex之前就是我们操作.class文件的...
2020-04-28 14:45:31 512
原创 Java8 lambda表达式
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。(百度百科)一、 lambda 怎么实现先看一个例子// 声明一个接口public interf...
2020-04-26 12:02:19 270
原创 编译插桩之自定义gradle插件
创建自定义的gradle 插件一、 创建Android Librarygradle 就是groovy 语言编写的1.1 main 文件夹下创建groovy文件夹除了src下的main目录和build.gradle 其他的都可以删了1.2 创建groovy 文件groovy 文件实现Plugin接口,并且实现apply()方法package kpa.custom.plug...
2020-04-24 10:00:04 435 1
原创 编译插桩
编译插桩就是在代码编译期间修改已有的代码或者生成新代码为什么说是编译插桩呢?其实它是一个动作和一个修饰,编译: 代码在编译期间,插桩: 在编译时期将需要的动作或者是逻辑插入已经编译的class文件中。任何不能促使自己提高生产力的技术都没有学习的意义,那怎么将这个技术使用到Android开发中呢?首先,在Android中,编译的过程为.java -> .class -> .de...
2020-04-23 17:41:16 807
原创 Vue 项目部署到nginx服务器脚本
Vue 项目,作为web开发新秀,深得大家的喜欢,对于Android开发者兼做web 项目来说,着实是一个很好的框架,项目框架Vue + elementVue 项目打包再package.json中配置打包项目"scripts": {// dev 本地环境运行 npm run dev "dev": "vue-cli-service serve", // 正式环境 npm ...
2020-04-22 11:17:14 385
原创 360 极速浏览器拦截支付宝支付链接
在Vue项目中涉及到了充值,充值方式大致是两种,需求通过微信SDK 支付通过支付宝支付(包含支付宝及支付宝中转的网银交易)对于前端不同于Android的是支付不需要做过多的操作,只需要调用接口就OK了方式在项目中配置根路径,在触发支付按钮之后打开新页面,进行支付,支付完成之后打开网站。微信// 打开本地页面,然后在本地页面中请求订单信息,进行支付var routese...
2020-04-21 17:15:28 887 1
原创 自我进阶 错误集
使用emulator时出现以下错误emulator: WARNING: system partition size adjusted to match image file (2562 MB > 200 MB)emulator:警告:已调整系统分区大小以匹配图像文件(2562 MB>200 MB)解决方式:emulator -partition-size 6144设置...
2020-03-13 18:04:18 698
原创 自我进阶(三) 编译软件开发工具包--SDK
emulator :未找到命令不要着急,解决方式,源码文件中执行一下初始化环境变量、设置编译目标、编译就OK了 ,不需要很长时间写了一个脚本#! /bin/bashecho "init android env". build/envsetup.shecho "=====设置编译目标====="lunch aosp_arm64-engecho "=================e...
2020-03-13 17:58:44 581
原创 自我进阶(二) Aandroid 源码编译
Android官方是提供了Android 源码编译的方法,在国外的话就相对来说比较简单了,一是语言无障碍,二是网络无限制,在国内的话困难就比较多了,网络就是最大的一点限制一、 源码编译在编译之前首先明确一个概念1.1 repo定义: 一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库它其实就是用来统一管理git 仓库的一...
2020-03-13 17:54:59 249
原创 自我进阶(一) Android 源码编译,环境准备
“其实不必要,但是就想试,可能看不懂,但是就想看”对于普通Android 开发来讲,长期混迹于Application层,或电商或工具或咨询,其实工作中是不多涉及底层知识的,就Application 层而言,用好API,用好动画,。对于耳熟能详的API很想知道其原理是什么,是怎么操作的,怎么写的,出了错误是怎么抛出的异常,怎么避免,其实也是经常会思考的问题,知己知彼才能百战不殆,现在开始弄一...
2020-03-13 17:40:07 314
原创 别人说你和狗屎一样 — databinding
对于开发来说,其实应该遵从两点,对于好的产品和代码就必须承认是好的,对于不认同的就是认为像狗屎一样一、 一千个人心中可以有一千个哈姆莱特,但技术它不行!任何事物都不是唯一的,大家都可以有自己的想法,我也是认同的,但是技术方面,不能是这样也不会是这样的1.1 本文想说点什么?DatabindingDatabinding 带给开发的快感Databinding 带来的影响kotl...
2019-12-06 16:18:50 400
原创 Retrofit中的设计模式之代理模式
Retrofit中使用到了很多设计模式,其核心的模式是代理模式,因为Retrofit 不是一个网络框架,而是一个对网络框架进行封装的工具,利用注解将请求的接口以java的接口形式展现,其请求的核心还是Okhttp,它的几个核心的功能:转换注解、解析请求的参数、请求、将请求的结果适配为我们想要的结果等重要功能都是在动态代理中完成的代理模式在java代码中,代理模式分为静态代理和动态代理...
2019-06-05 17:32:45 517
原创 从Android 开发到Flutter 之 开屏页和广告页《二》
在APP开发的过程中,我们一般需要一个开屏页和一个广告页开屏页开发Android 的都知道,Android启动的时候会有一个小的空白,我们的解决方法是给开屏页设置style ,让其在加载声明周期方法之前先设置一个填位图,消除空白Flutter 项目在IOS上是秒起的,不会出现这个问题,在Android上还是会出现的,但是Flutter 项目已经将这个操作在创建项目的时候就实现了...
2019-04-11 12:24:35 2776 1
原创 Retro2+okHttp3+Rxjava2 请求时BASE_URL不能改变的解决办法
场景在开发的过程中,采用的是retrofit2 + okHttp3 + RxJava2封装的网络请求框架,不多赘述封装的过程。在使用的时候出现了一个这样的问题。一般在开发的时候都是将Base_URL 根据BuildConfig.DEBUG去动态设置的,但是这个动态仅限于我们打包时的选择,release还是debug,只能简单的满足我们两个开发环境的切换问题,那一般图片或者大文件都会采取...
2019-03-05 18:22:13 1057
原创 Mac 中gradle修改配置后 版本不发生变化问题
在开发使用的gradle ,在更新的时候有时候会出现“` Minimum supported Gradle version is 4.9. Current version is 4.7“`在项目中配置也是4.9 ,发现是没有问题的,那问题就在本地的gradle版本了打开命令行gradle -v 显然展示的是gradle 4.7 这是我们要进行的操作就是在...
2018-09-11 17:05:22 2470
原创 Android 指纹识别(给应用添加指纹解锁)
使用指纹 说明 : 指纹解锁在23 的时候,官方就已经给出了api ,但是由于Android市场复杂,无法形成统一,硬件由不同的厂商开发,导致相同版本的软件系统,搭载的硬件千变万化,导致由的机型不支持指纹识别,但是,这也挡不住指纹识别在接下来的时间中进入Android市场的趋势,因为它相比较输入密码或图案,它更加简单,相比较密码或者图案,它更炫酷 ,本文Demo 使用最新的28 支持的...
2018-09-04 15:54:52 11151
圆形图片 (kotlin)
2017-09-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人