自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 资源 (2)
  • 收藏
  • 关注

原创 Flutter-网络请求封装

一、前言网络请求是我们App开发过程中的重要内容,大部分App都需要和服务器进行数据交互,因此在开发过程中,我们需要封装我们网络请求的代码,对request、response以及error做统一处理,减少业务开发中的样板代码。二、使用DIO进行网络通讯2.1 配置网络请求的基本信息关于dio的具体用法参考dio官方文档。按照下面方式配置diopackage:dependencies: dio: ^4.0.4在网络请求中,我们通常需要配置服务器的地址以及超时等,这里我们新建一个http_co

2022-01-24 18:45:35 3934

原创 Flutter-JSON转Model以及json_serializable使用步骤

一、前言现在大多数接口返回的数据都是json格式,在面向对象的开发过程中,基本上都需要转换为Model模型,方便在开发中使用。在Android开发中json字符串转Model对象,可以使用Gson、FastJson等,但在Flutter中确没有这么方便。在Flutter中,提供了dart.convert以及json.dart来解析json字符串,但转换后Map对象,要转换为Model对象还需要进一步处理。二、JSON转Modle手动转换2.1 定义Model对象以及转换方法class Photo {

2022-01-18 16:55:06 5125

原创 Flutter-了解Future及其用法

一、前言最近在做Flutter网络这块,涉及到耗时操作,显然要用异步编程。在其他语言,比如java、c++等,会使用多线程来实现。而在Dart语言中,它是单线程+事件循环的设计模式,其中主要使用Future来实现异步操作,为了快速的了解Flutter的异步编程,需要熟练Futter的概念以及用法。二、Future是什么同步编程中,立即返回执行的结果或者抛出异常;而异步编程中,返回的是将要完成的结果未来。Future代表异步执行的未来。var future = Future上述代码在执行过程中

2022-01-18 16:54:01 7835 1

原创 Flutter-路由和导航

一、前言在Android开发中,界面的跳转使用的Context.startActivity来实现,界面通常指的Activity,如果我们的设计是单Activity+Fragment来实现,界面的跳转就需要使用FragmentManager来完成。这些概念到了Flutter中有了一些变化。二、路由是什么我们通常使用“屏”来展示应用的不同页面(界面)。比如应用有一屏展示商品列表,点击Item的时候,跳转到新的一“屏”展示商品的详细信息。在Flutter中,屏(screen) 和 页面(page) 都叫

2022-01-07 16:08:08 1827

原创 Flutter-登录界面实战

一、前言前面了解了Flutter的适配原理级及适配方案,接下来我们进行一个实战,开发一个登录界面,效果图如下:二、代码实践2.1 LoginPage这里LoginPage使用StatefulWidget来实现:class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @override _LoginPageState createState() => _Log

2022-01-07 16:05:58 5676 4

原创 Flutter-适配相关

一、前言做移动应用开发,各个系统都自己的适配方案,比如Android可以用dp、sp来描述大小,IOS使用pt来描述。但是入手Flutter后,却发现我们要描述的widget的大小没有单位,比如Container( width: 40, height: 40,),那么这个40到底是什么意思呢?px、dp或者dp,其实都不是。二、了解的Flutter的尺寸测试手机信息:720 * 1080 320dpi。运行以下测试代码void main(){ runApp(MaterialA

2021-12-31 11:14:19 2079 2

原创 Flutter - Hello world

一、概要Flutter发展已经逐步稳定,使用的人群和企业也越来越多,已经逐步得到了大家的认可。最近公司有一个项目,用户相对固定,因此打算使用Flutter来做一次实验,到底能不能做出我们能够接受的效果。二、环境搭建2.1 环境变量配置说明:以下全部操作均在Windows上。官网搭建说明:https://flutter.cn/docs/get-started/install初次使用建议参考一下。这里注意一点:为了正常升级和通过pub package 命令获取packages,需要设置两个环境变量

2021-12-31 09:43:31 511

原创 储能系统扫盲

一、前言随着新政策的推出,要求相关的新能源发电站都需要配置相关比例的储能。同时增大了峰谷电价差比例,使得储能在用户侧也存的发展也存在一定的机遇。为了了解储能相关产业链,这里对新手做一个储能相关的知识点扫盲。二、专业名词解释任何一个行业都相关专业术语或者行话,这里描述一些储能系统中常用的名词。EPC: 工程总承包EMS: 能量管理系统PCS: 储能变流器BMS: 电池管理系统LFP: 磷酸铁锂三、储能场景3.1 发电侧位置: 集中式新能源电站旁功能: 1,减少弃用;2,平抑波动

2021-11-19 16:38:39 3157

原创 了解原码、反码、补码以及Java中byte的读写

一、前言平时的App应用层开发中,很少和byte打交道,最近刚做了一个和硬件设备交互的产品,通信使用UDP,交互协议就是自己定义的协议,每个数据包中分别定义不同的字节数来代表不同的意义,比如:字节号信息内容字节数码值说明1-2数据头20x3e80x3e83工作状态1bit0-bit70x00:待机;0x01:发射……………要了解这块内容,必须要了解二进。字节是二进制数据的单位,一个字节通常为8位长,其中位(bit)使用的0或1表示,通常

2021-11-05 16:22:30 524

原创 产品经理之初体验

一、前言最近开发量不大,处于个人感兴趣,体验一次产品经理的角色,负责了一个产品。下面分享一下整个产品的设计流程。二、项目实践2.1 需求调研本次产品主要针对硬件的故障维护,考虑到后期的设备量以及人力成本,将硬件设备故障交由代维公司进行维护。设备的故障维护维修最终都需要派给指定人员,因此将整个系统定义为:工单系统,设备故障已单条工单的形式派给相应的维护人员。2.2 产品流程做产品设计,整个流程需要非常的清晰,对工单系统而言,需要考虑工单的来源以及处理流程,这里借助时序图来完成,如下所示:这里第

2021-10-13 14:58:38 160

原创 数据流-使用入门

一、前言数据流以协程为基础构建,可提供多个值。概念上来讲,数据流可以通过异步方式(挂起函数中执行)进行计算处理一组数据系列(这个与协程挂起函数返回单个值相反),但要求所发出值的类型必须相同。例如,Flow是发出整数值的数据流。数据流包含是三个实体:提供方:会生产添加到数据流中的数据。得益于协程,数据流还可以异步生成数据。中介(可选):可以修改发送到数据流的值,或者修正数据流本身使用方:使用数据流中的值二、数据流使用2.1 创建数据流创建数据流,使用数据流构建器对应的API,目前有以下几

2021-10-12 15:30:49 1099

原创 协程-执行过程

一、前言在前面已经了解了协程的使用方法,为了能够更深入的了解协程的设计原理,那么我们来探究以下底层的实现原理。二、执行过程分析我们了解到,协程的创建和执行需要在CoroutineScope中,下面我们借助源码来分析CoroutineScope的执行过程。2.1 创建CoroutineScope对象 val scope = CoroutineScope(Job()+Dispatchers.IO)CoroutineScope的创建很简单,传入一个CoroutineContext。下面我们

2021-10-12 15:29:04 264

原创 协程-在使用过程需要了解一些内容

前言通过前一篇协程-Android端使用场景入门,了解协程的一些使用场景,为了能更高效的使用协程,我们还需要了解知识,这样才能在使用过程中得心应手。为了能够更好的理解后面的内容,这里针对一些概念做统一的说明(1)协程层级划分CoroutineScope称为RootParent,同时也是parentCoroutineScope启动的协程称为RootParent的child,同时协程里面又可以启动协程,此时该层也叫parent协程可以看做一种层级结构,统一概念是为了后面提到child或者pare

2021-09-24 15:33:56 381

原创 协程-Android端使用场景入门

前言我们在学习一些新技术的时候,首先会关注的他的应用场景以及一些使用有点,满足我们的需求后在项目中使用,然后再研究底层的实现原理及本质,在遇到问题的时候能够快速解决。因此对协程,我们的首要目标还是熟练使用。协程对于Java开发人员来说相对陌生,Java语言本身没协程概念。Kotlin从版本1.3中才引入进来的。官方解释协程一种并发设计模式,使用它来简化异步编程代码,用同步的编码方式实现异步的效果。下面通过一些示例来说明协程的使用。协程使用添加依赖项 // 添加kotlinx-coroutin

2021-09-23 16:18:57 1571

原创 性能优化-开发中的注意事项

一、前言性能优化是一个持续的过程,好比我们身体,不能等生大病了才明白健康的重要,平时我们就该注意锻炼身体,保证一个健康的身体状况。对程序而言也是如此,平时开发的就要注意性能方面的问题,不能等到后期出现体验不好的时候再进行优化。对硬件而言,我们开发的程序的影响在两个方面:CPU和内存。下面就从这两个方面入手分享一些在开发中应该注意的事项。二、内存针对JVM而言,内存的管理由虚拟机帮我们完成,GC在回收内存的过程中可能会暂停当前的所有线程,然后进行内存回收,这样就可能造成UI显示丢帧,出现卡顿,如果再频繁

2021-06-16 18:54:46 242

原创 运用弹簧物理学原理为图形运动添加动画

一、前言Android系统已经给我们提供了属性动画,ValueAnimator以及ObjectAnimator,这两个动画效果已经满足我们开发中的大多应用场景,但是基于物理特性的动画用上述的两个动画效果就很难实现,但是官方也给我们提供了运用弹簧物理学原理的动画效果库dynamicanimation,让我们在开发中快速的使用。下面的这个效果就是实际项目中基于dynamicanimation来完成的.二、使用流程2.1 添加支持库implementation 'androidx.dynamicanim

2021-03-31 19:45:46 465

原创 多指触摸处理

一.前言在开发中,我们经常会使用自定义View进行拖动和缩放,拖动一般是单指触摸,但是实际情况我们也可以使用多指进行触摸移动,如果这是我们进行抬起二.了解触摸事件2.1 了解MotionEvent中手指的index和id在MotionEvent中,存储了每个手指的index和id:Index: 每个MotionEvent在数组中存储了手指的信息,index表示手指在数组中的位置,开发中我们也是通过index作为参数来获取相关信息,比如event.getX(int pointerIndex),ev

2021-03-12 19:23:31 443

原创 WebView拦截线上资源,加载离线资源

一、前言最近的项目开发中接入了一些网页功能,Webview加载完成大约需要10秒左右,经过使用Charles抓包分析,发现在加载过程中出现了几个比较大的js和css文件,这些文件在没有压缩之前有15M左右,发布线上压缩有也有3M左右,这些资源严重影响了webview的加载速度,同时也带来了不好的体验。在极致情况下,web端应该去做这些优化处理,但在项目赶时间的情况下,客户端在做了这些大文件资源做了离线处理,让webview加载这些的时候从本地加载。二、Webview拦截资源2.1获取需要拦截的资源/

2021-01-31 19:58:08 1232

原创 属性动画技能实践

前言通过 属性动画原理解析,我们了解属性动画的整个运行机制,对底层的原理有了一定的了解,也学习一些知识点,但是学习过的知识点在没有自己实践都是别人的,只有自己实践后才属于自己的。接下来分享一些属性动画的一些知识点运用项目中的经历。实践实践一:屏幕刷新机制我们知道属性动画基于屏幕刷新回调机制来实时更改属性的值,而在实际的项目应用用,也会很多实时刷新屏幕的需求,接下来我们通过秒表计时器需求来分析刷新机制在实际应用。秒表计时器的效果图如下所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下

2021-01-19 19:03:10 186

原创 属性动画原理解析

前言属性动画作为现在开发中常用的动画,我们需要对他有比较详细的了解,才能够在开发中随心和高效的使用。在了解属性动画之前我们先了解Android前期的视图动画一、视图动画视图动画是为View对象添加动画效果的功能,如果想为非对象动画添加效果,则必须自己实现自己的代码才能做到。视图动画仅公开 对象的部分方面来供您添加动画效果,比如旋转、错放、移动视图动画只是在绘制视图的位置进行修改,而不会修改实际的视图本身。例如,为某个按钮添加了移动动画,该按钮会正确绘制,但能够点击按钮的实际位置并回修更改,我们必须

2021-01-15 19:01:44 800 1

原创 了解JVM的内存管理机制

一、前言在前面的章节了解了class的文件结构和类加载机制,所有的这些数据都是运行在内存中,因此接下来需要了解JVM的内存管理机制。二、运行时内存区域划分JVM在运行的时候,把自己所管理的内存分为若干区域,每个区域有各自的功能。从线程的角度出发,分为共享内存区域和私有内存区域线程私有内存区域,包括以下三块程序计数器java虚拟机栈本地方法栈共享内存区域堆:对象实例(GC新生代、老年代)方法区(类信息、常量、静态变量、及时编译后的代码等)运行时常量池(字面量、符号引用)

2021-01-05 19:00:01 166

原创 了解Class文件结构和虚拟机的类加载机制

一、了解Class文件的结构规范Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式管理。我们的java虚拟机只识别符合它规范的Class文件,因此在了解JVM其他的相关知识点的时候,我们需要先了解Class文件的结构规范。Class文件以一组8位字节为基础单位的二进制流,各个数据项严格按照顺序紧凑的排列在Class文件中,中间没有添加任何分隔符。Class文件个采用伪结构来存储数据,两种数据类型:无符号数和表。无符号数:属于基本的数据类型,已u1、u

2021-01-05 18:57:43 191 4

原创 自定义视图组件流程

一、前言Android提供了一个复杂且强大的组件化模型,帮我我们根据布局类View和ViewGroup来构建界面。Button、TestView、EdiText,LinearLayout、FrameLayout、RelativeLayout 等,然而在开发过程,一些系统通过的控件不能满足我们的要求,因此需要我自定义视图组件。二、自定义视图组件的方式完全自定义视图组件,继承View或者ViewGoup来完成复合控件,结合现有的视图组件组合为满足我们需求的控件修改现有的View类型,比如继承自Ima

2020-12-31 18:32:18 283

原创 Android-事件分发-嵌套滑动

前言在前期做一些Android酷炫效果并遇到嵌套滑动问题的算是一大难点,没有标准的规范,开发人员根据自己的需求进行随意控制,导致做的一些组件缺少复用性,同时也不利于后期的维护。后期官方出了自己的嵌套滑动标准,主要由NestedScrollingChild、NestedScrollingChildHelper、NestedScrollingParent、NestedScrollingParentHelper进行控制,从而规范了嵌套滑动事件的处理标准。下图展示的一个嵌套滑动的效果图,这里我们定义:A:表

2020-12-24 18:55:14 285 1

原创 Android-ViewGoup事件分发机制

前言Android的事件分发机制是从上往下进行分发,了解了View的事件分发后,我们还需要了解ViewGroup的事件分发原理。实际中View是和ViewGroup结合使用的,同时这两者之间还存在嵌套滑动。ViewGoup事件分发源码解析 @Override public boolean dispatchTouchEvent(MotionEvent ev) { ....... boolean handled = false; if (onFilt

2020-12-18 19:03:23 183

原创 Android-View事件分发机制

前言Android开发中一些简单的UI开发其实用不到事件分发,但是要做一些特殊的功能的时候会用到触摸事件的处理,那么我们就需要了解View和ViewGoup的事件分发机制,这样才能在触摸屏幕的时候在不同的View和ViewGroup直之间切换事件处理。下面将从源码入手分析View的的事件分发机制。View事件分发源码分析事件的分发机制由dispatchTouchEvent进行控制,根据里面的逻辑进行判断是执行OnTouchListener还是OnClickListener;所以要了解事件的分发原理,就

2020-12-18 19:02:02 184

原创 Android权限使用注意事项

文章目录一、前言二、高危权限2.1官网列出的危险权限组及权限说明2.2如何避免一些不必要的权限出现三、清单文件合并四,最后一、前言随着Android系统的升级以及整个行业对用户隐私的保护,在开发中随意使用一些高危权限同时用户隐私保护政策中又没有对相关的权限进行说明,被公安部检测到或者一些上架的应用市场检测到后,将会面临约谈以及下架的风险。因此在开发中使用一些高危权限的时候一定要做好相关的隐私保护政策说明;针对第三方的SDK的使用,需要做一些安全措施,避免打包的时候将一些没有使用的高危权限合并到Manif

2020-12-15 19:28:07 596 2

原创 Retrofit实现流程分析

文章目录一、前言二、基本使用流程三、创建Retrofit对象以及网络接口对象3.1 Builder(建造者)模式创建Retrofit3.2 代理模式3.3 模拟简单的请求操作3.4 对OkHttp的二次封装3.4.1 重新定义Response3.4.2 重新定义Call3.4.3 定义OkHttpCall,执行网络请求操作3.4.4 Converter,满足开发中的各种需求工厂模式3.5 定义CallAdapter ,灵活扩展各种类型的返回值5.1 CallAdapter 适配器模式四、对接口中定义的方法的

2020-11-05 21:17:53 359

原创 性能优化-(三)减少不必要的内存使用

前言满足了产品的功能基本需求,仅仅的是一个开始,后续需要进可能提高应用性能。用户除了使用产品的基本功能外,还期望我们的应用耗电少、启动快、对用户互动响应迅速,希望是一个酷炫而且高效的应用。内存的合理利用保证我们App能够正常运行,如果不注意控制内存的使用,则可能会导致OOM;如果能够高效的利用内存,则可以避免一些内存抖动可能带来的UI卡顿现象。方案一:谨慎使用Service在不需要某项服务是让其保持运行状态,是Android应用可能犯下的最严重的内存管理错误之一。如果您的应用需要某项服务在后台执行工

2020-09-28 19:50:47 356

原创 性能优化-(二)通过读取日志信息查看内存使用情况

前言满足了产品的功能基本需求,仅仅的是一个开始,后续需要进可能提高应用性能。用户除了使用产品的基本功能外,还期望我们的应用耗电少、启动快、对用户互动响应迅速,希望是一个酷炫而且高效的应用。下面介绍Android Studio的日志输出信息来查看APP的内存的使用情况。Dalvik日志消息在Dalvik中,每个GC都会将以下信息输出到logcat中:D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats,

2020-09-22 19:30:03 2215

原创 性能优化-(一)缩减包体积优化方案

前言满足了产品的功能基本需求,仅仅的是一个开始,后续需要进可能提高应用性能。用户除了使用产品的基本功能外,还期望我们的应用耗电少、启动快、对用户互动相应迅速,希望是一个酷炫而且高效的应用。APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。因此,缩减APK包大小也作为性能优化的一个方面。一、使用Android Size Analyzer工具Android Size Analyzer 工具可让您轻松地发现和实施多种缩减应用大小的策略。可作为Android Studio 插件或独立的JAR使用

2020-09-18 20:18:51 678

原创 OkHttp-(二)Interceptor以及对应的责任链模式

文章目录前言OkHttp的Request和Response简易流程Intercptor和Chain在OkHttp中的内部实现小结前言对于客户端来说,网络请求就是发送一个Request,得到一个Response的过程;很多的网络请求框架都会对这个过程进行封装处理,减少我们对内部逻辑的了解以及用少量的代码完成整个请求流程。不同公司的网络请求定义格式不一样,就需要我们的网络请求框架能够更灵活的扩展,从而在不改变源码的情况下,完成业务的需求。比如在请求过程,对请求的数据统一加解密处理,不同的业务,设置不同的He

2020-09-11 18:52:26 380

原创 OkHttp-(一)HttpUrl了解

1,git地址:https://github.com/square/okhttp2,官网地址: https://square.github.io/okhttp/Http作为现代应用程序的常用联网方式,用于交互数据和媒体信息。高效的执行HTTP能让你的程序更快的加载数据并节省带宽。OkHttp作为默认的高效Http客户端,有以下优势:HTTP/2 支持,HTTP/2运行对同一主机的的所有请求共享一个socket当不支持HTTP/2的情况,连接池的使用,减少请求延迟。GZIP透明传输对respo

2020-09-11 18:50:53 3929

原创 Okio实现过程分析

一.Okio是什么文档介绍地址:https://square.github.io/okio/github地址:https://github.com/square/okioOkio是java.io和java.nio的一个补充库,使访问、存储和处理数据更加容易。包含两部分:ByteStrings 和 BuffersBysteString:是一个不可变的字节序列,可以看做Sring丢失已久的兄弟。它很容的将字节编码或解码为hex、base64 和UTF-8;Buffer:可变的字节序列,像ArrayL

2020-09-08 20:10:49 222

原创 Android架构组件-LiveData扩展使用

文章目录前言扩展LiveDataLiveData-MediatorLiveDataTransformations 对LiveData进行转换处理1,map1,switchMap前言LiveData的优势以及实现原理已经在上一篇中介绍,那么接下来接触一些扩展用法,从而更能体会该组件的设计意图,方便在业务中进行相应的扩展。扩展LiveData以下为股票价格监听StockLiveData,只有观察者生命周期处于STARTED或者RESUMED状态,则LiveData会认为观察者处于活跃状态,再进行相关连接

2020-09-08 19:52:25 337

原创 APP安全(五)-完结使用篇

前言前面已经介绍了一些基本的实现原理,接下来我们需要完善该组件,该组件一共包含三部分:App Library、Key Library、Server Library,项目使用中需要结合这三个Library同时使用。App Library主要使用APP端使用,包好了签名校验和数据加解密Key Library主要是生成APP和服务端使用的秘钥文件Server Library服务端使用,完成...

2020-03-22 22:45:42 267

原创 APP安全(四)-结合MD5、DES生成一个AES Secret Key

一、 前言签名讲过使用我们使用AES加密算法与服务端进行数据加解密交互,对AES来说,secret key,如果我们把key硬编码在代码里面,被逆向后也很容易找到对应的key,隐藏我们需要设计一套算法来保证key是动态生成,不是硬编码在代码里。这里我们使用MD5以及DES来增加算法的破解难度,其中的核心是MD5摘要算法,它的出现保证了secret key的产生不是唯一的。二、具体实现方案1)...

2020-03-10 00:25:31 668

原创 Android逆向常用工具

一.基础反编译APKTool介绍:重打包以及资源解码工具官网地址:https://ibotpeaches.github.io/Apktool/install/dex2jar介绍:将dex转成jar文件针对apk中有多个dex的情况,直接使用:dex2jar xxx.apkGithub地址:https://github.com/pxb1988/dex2jar可在该地址的Re...

2020-03-09 21:00:49 585

原创 APP安全(三)-Java-AES加解密客户端数据

一、前言APP安全(二)-客户端使用c、c++实现AES加解密)介绍了客户单实现对数据的加密。但我们客户端通常是需要和服务端交互,提交数据和获取数据,因此服务端也同样需要根据客户端的加解密原理实现同样的加解密算法。上篇文章有对AES加解密的介绍,因此我用Java按照相应的规则实现即可。二、具体实现java端的实现相对比较简单,使用java api即可满足要求,可参考一下代码public c...

2020-03-09 19:49:40 403

原创 APP安全(二)-c、c++AES实现加解密

一、前言APP安全(一)-防二次打包(C、C++签名校验)介绍过签名校验,防止二次打包,还达不到安全的目的,我们需要保证我们所写的代码不能被绕过,还需要服务端配合,完成数据的加解密以及校验,这样能够达到巩固签名校验的目的,同时服务端校验失败后不用返回业务数据以及网络传输的数据被抓包软件抓取后不能随意的破解。在HTTPS中,对传输的数据采用的是AES算法实现,因此,我们在也使用AES算法实现,这样...

2020-01-21 18:20:40 605

基于openssl的MD5实现

基于openssl和ndk,实现c++版MD5及位运算生成一个32位的字符串;该模块是一个集成了openssl静态库的资源,下载后可直接运行。

2017-08-30

openssl工具

Window环境下使用该工具生成RSA公钥和私钥

2016-01-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除