自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 Flutter 事件分发

一 事件分发默认情况下,以 Android 为例,所有的事件都是起原生源于 io.flutter.view.FlutterView 这个 SurfaceView 的子类,整个触摸手势事件实质上经历了 JAVA => C++ => Dart 的一个流程,无论是 Android 还是 IOS ,原生层都只是将所有事件打包下发,比如在 Android 中,手势信息被打包成 ByteBuffer 进行传递,最后在 Dart 层的 _dispatchPointerDataPacket 方法中,通过..

2021-07-24 14:40:46 739 2

原创 flutter之Provider(一)

网上有不少介绍Provider的文章,但是感觉大部分对于初学者而言不够友好,很多在文章开始就写了大片的代码或者是一通的状态管理的介绍,但是实际上根本不需要那么复杂。本篇文章当然也会简单的介绍Provider的使用,但是我们更多还是通俗的介绍Provider的原理。Provider 从名字上就很容易理解,它就是用于提供数据,无论是在单个页面还是在整个 app 都有它自己的解决方案,我们可以很方便的管理数据Widget树层级如果是原生的android,对于全局共享的数据我们一般可以放在applicatio

2021-07-18 19:50:30 617 1

原创 Flutter 之生命周期

前言在 Flutter应用程序中,生命周期涉及两个:一个是 Widget 的生命周期,一个是应用程序的生命周期。一、Widget 的生命周期Flutter 里的 Widget 分为 StatelessWidget 和 StatefulWidget 两种,这两种 Widget 的生命周期是不一样的,我们接下来具体来看。1.1StatelessWidgetclass TestWidget extends StatelessWidget{ @override ...

2021-07-18 19:03:40 878 4

原创 Element树的构建过程

Element树的构建过程对flutter有所了解的都知道,flutter页面整体构造成了一个Widget树,但是在Widget树背后实际隐藏着的是Element树,Widget仅仅是一个配置文件,是不可以修改的,如果想要更新数据一般是调用setState方法,之后页面会重新构建,重新构建的过程中Widget会重新创建,但是Element可能会复用,但是我们本章主要研究的是Element的创建过程,关于Element的更新与复用过程我们在另一篇文章里面讲解。如果只是单纯的讲解Element的创建过程过程非

2021-07-09 10:27:52 371 1

原创 android 组件化之概述《一》

前言模块化在进入组件化之前,我们先说一下模块化。一个功能分为一个模块,例如登录模块,支付模块,广告模块。传统的开发模式中一个模块就是一个Module(也有不同模块放在不同包里面的情况)。模块在功能上对代码进行了划分,但是在开发上任然存在问题。例如当 需要debug 某一个模块的时候此时我们必须编译整个项目,当项目比较大的什么会很耗时间。我们希望任何一个模块都可以单独运行,单独测试。实际组件化话主要解决的就是上面这个问题,希望将每一个模块都可以单独开发,运行,测试...

2021-07-09 10:25:37 143 1

原创 android 组件化之ARouter《二》

一 ARouter的使用步骤第一步 添加依賴因为ARouter在各个模块都会用到,因此可以在ModuleBase 里面添加依赖。 api 'com.alibaba:arouter-api:1.4.0'第二步 引入注解处理器ARouter 使用了编译时注解,这里需要在各个子模块引入处理器。annotationProcessor 'com.alibaba:arouter-compiler:1.2.1' 为编译期间生成路径映射。同时也需要在各子模块的build中加入..

2021-07-09 10:25:27 357 1

原创 android 组件化之ARouter《三》

前言我前一篇介绍偶尔ARouter的初始化过程已经导航过程。在初始化话的时候我们知道需要遍历所有的dex 文件找到编译期间生成的类,这个过程比较耗费时间,因此ARouter 提供了一个gradle 插件在编译期间遍历所以的class 文件,找到动态生成的类,然后动态修改字节码插入部分代码,避免了程序运行期间查找,提高了效率。本篇就来研究器实现方式。一、动态生成的代码我们通过Route 注解了一个名为TestActivity的页面,在编译期间会动态生成一些类,关于动态生..

2021-07-09 10:25:14 295 1

原创 android 内存管理之adj 《四》

概述前面几篇介绍了adj与内存回收之间的关系,在实际应用中我们可以根据adj 来优化我们的app。1.1 优化1.ui进程启动service的隐患案例a:进程启动一个服务开始执行备份,备份服务运行在ui进程(服务未调用startForeground())隐患:备份服务一般需要较长时间,在用户按Home键退出后台后,备份进程会处于previous状态,继续使用手机其他应用,会是使得备份进程处于cch-started-ui-services的状态,即是启动了服务并且包含ui的进程

2021-07-09 09:44:20 173

原创 android 内存管理之adj 《三》

概述1.1 oom_adj与oom_score_adjAndroid系统的设计理念正是希望应用进程能尽量长时间地存活,以提升用户体验。因此当应用推入到后台的时候进程并不会被立即杀死,而是存活一段时间,这样下次再使用则会非常快。但是如果处于后台的进程过多导致内存不足,此时就必须有选择的杀死部分进程。到底该回收哪个进程呢?那么需要一个能管理所有进程,根据一定策略来释放进程的策略,这便有了lmk,全称为LowMemoryKiller(低内存杀手),lmkd来决定什么时间杀掉什么进程。系...

2021-07-09 09:44:03 1401

原创 android 内存管理之adj 《二》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-09 09:43:28 1113

原创 android 内存管理之adj 《一》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-09 09:43:14 601

原创 android 开发之activity 启动流程《四》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-08 21:21:57 534 1

原创 android 开发之activity 启动流程《三》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-08 21:21:42 598

原创 android 开发之activity 启动流程《二》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-08 21:21:27 401

原创 android 开发之activity 启动流程《一》

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

2021-07-08 21:21:12 400

原创 Android 开发之Gradle《二》脚本的函数的调用

一、MOP前面一节说过build.gradle 脚本会被编译为一个ProjectScript 的子类,因此我们可以在build.gradle 里面调用ProjectScript的所有方法,但是上面调用的getRootProject 方法是Project 的方法,难道build.gradle脚本编译之后生成的类是Project 的子类?。答案当然是否定的。下面我们就来看看这是怎么回事。1.1 groovy 对象首先我们要知道Gradle 脚本使用的groovy 语言。Groovy 中的对象其实

2021-07-08 19:20:07 790

原创 Android 开发之Gradle《三》DynamicObject

前言在前一篇文章里面介绍了build.gradle 里面方法调用的路由过程,知道了build.gradle 内部调用方法会通过DynamicObject 映射到对应的Project类里面。build.gradle 脚本在编译之后会生成一个BasicScript子类,BasicScript有一个成员变量target,放到build.gradle脚本里面来讲target 就是Project 对象,setting.gradle 脚本里面target就是Settings对象。假如build.gradle 脚本

2021-07-08 19:19:52 294 1

原创 Android 开发之Gradle《四》Configuration

前言在往下面讲解前,我们先了解一下Configuration的一些知识。按照官网所说:Every dependency declared for a Gradle project applies to a specific scope. For example some dependencies should be used for compiling source code whereas others only need to be available at runtime. Gradle rep

2021-07-08 19:19:42 1583 1

原创 Android 开发之Gradle《四》依赖下载

前言 implementation 'org.greenrobot:eventbus:3.0.0'前面一章介绍了通过implementation 添加依赖的执行过程,在build 阶段的时候gradle 就会下载对应的额依赖。本章主要研究依赖的下载过程。一 下载依赖Configuration 有一个resolve 方法。 /** * Resolves this configuration. This locates and downloads the files which m

2021-07-08 19:19:31 1026

原创 Android 开发之Gradle《一》

前言现在的Android应用都是采用Android Studio来开发的,AS默认是采用Gradle作为构建工具的。所谓的构建工具是一个把源代码生成可执行应用程序的过程自动化的程序(例如Android app生成apk)。构建包括编译、连接跟把代码打包成可用的或可执行的形式。下载依赖将源代码编译成二进制代码打包生成的二进制代码进行单元测试部署到生产系统在Android开发中,很多时候我们不需要修改 *.gradle 文件太多,我们添加依赖、修改target compile、最低支持API

2021-07-08 19:18:56 594

原创 Android 开发之Glide《五》缓存

前言一、简介缓存设置 Glide.with(this).load("url").skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL)设置内存缓存开关:true 表示不使用内存缓存skipMemoryCache()设置磁盘缓存模式:diskCacheStrategy()可以设置4种模式:DiskCacheStrategy.NONE:表示不缓存任何内容。DiskCacheStrategy.DATA:表示

2021-07-08 19:18:47 949

原创 Android 开发之Glide《四》ModelLoader

一、ModelLoader翻译过来就是将复杂数据模型转换为具体的数据。数据模型就是资源的地址,这个地址一般是url,但是也可以是任何自定义的类,如果是一个自定义一的类,那么我们就必须提供对用的LoadData。这个LoadData 负责加载根据资源的地址获取到对应的数据。Glide 默认的资源地址类型可以是URL,URL,String ,GlideUrl。例如 Glide.with(this).load("https://n1image.hjfile.cn/zhuanti/2020

2021-07-07 10:12:02 557

原创 Android 开发之Glide《三》

前言前面一章我们介绍了Glide 下载图片的过程,我们本章梳理下载图片之后回调的过程一、回调loadData 获取到数据流之后通知回调,数据就绪。此处的callbakc 实际指向的是SourceGenerator。所以看看SourceGenerator对象的onDataReady方法都做了什么private final FetcherReadyCallback cb; //成员变量@Overridepublic void onDataReady(Object data) { DiskC

2021-07-07 10:11:48 111

原创 Android 开发之Glide《二》

前言前一章介绍了Glide 的创建与Request 的创建,本篇我们探究Request 的执行过程。一、下载图片 private <Y extends Target<TranscodeType>> Y into( @NonNull Y target, @Nullable RequestListener<TranscodeType> targetListener, @NonNull RequestOptions options)

2021-07-07 10:11:35 199

原创 Android 开发之Glide《一》

前言Glide是一个快速高效的Android图片加载库。同样的本篇文章侧重分析Glide的源码分析,不介绍Glide 的使用,有不会用的同学可以先百度一下。在介绍Glide 之前,我们先分析一个图片库需要解决哪些问题。通常情况下我们的图片都是展示在一个列表里面,如果上下滑动的话,需要确保这个图片只会创建一次请求。快速滑动列表的时候会android 会复用View,此时怎么避免图片显示错乱,例如ImageView当前显示A图片,滑动的时候会多次复用,需要依次显示B,C 图片,需要确保图片显示

2021-07-07 10:11:22 445

原创 Android 开发之编译时注解之基础知识

注解注解,也被称为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。(Java编程思想)目前很多框架开发或者Android开发中都用到了注解,SDK开发中也有很多可以对接口添加限制以规范用户使用的规则,这些都是值得我们去学习的。关于注解的基础知识与android自定义注解本文就不做具体的介绍了,给大家推荐一篇博文如果有不了解android 自定义注解的同学可以先看看这篇文章。android自定义注解简单的例子public class MyPr

2021-07-07 09:02:56 319

原创 Android 开发之EventBus《二》

前言在EventBus 源码解析里面我们已经分析过EventBus 是如何通过反射获取到注解的方法,并且在post消息的时候将消息分发给对应的方法处理的流程。在通过反射获取获取所有的被Subscribe注解的方法的时候需要获取类内所有的方法,在过滤这个方法上是否是存在 Subscribe注解,这个过时比较耗时,因此EventBus通过编译时注解在编译时获取到Subscribe注解的方法的名称,参数等信息,在调用register的时候可以快速获取到所有被Subscribe注解的方法,以此提高了效率。我们本篇

2021-07-07 09:02:45 231

原创 Android Okhttp3《四》CacheInterceptor之DiskLruCache

前言本章我们介绍一下ConnectInterceptor,这个类主要是与服务端建立连接操作,例如HTTP1,HTTP2,HTTPS以及HTTP代理与Socktet代理。在 OKHTTP 底层是通过 SOCKET 的方式于服务端进行连接的,并且在连接建立之后会通过 OKIO 获取通向 server 端的输入流 Source 和输出流 Sink。这里我们仅仅分析HTTP1 的相关部分,同时本篇不会像之前几篇写的那么细致入微,这里仅仅大致分析一下其实现方式。一、ConnectInterceptor1.1

2021-07-07 07:48:40 158

原创 Android 开发之Retrofit》《一》

一、Retrofit是什么?Retrofit 是一个 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装,所以你可以将Retrofit 看成是一个对OkHttp 封装的网络请求框架。本篇文章也不但算介绍Retrofit 的基本用法,而是研究一下Retrofit源码,知其然也要知其所以然。二、源码解析 public interface NetInterface { @GET("getSomething")

2021-07-07 07:48:28 272

原创 Android 开发之EventBus》《一》

一、EventBus 简介EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。本篇文章照旧不会介绍EventBus 的基本使用,而是作用着重与源码,研究Event

2021-07-07 07:48:19 324

原创 Android Okhttp3《一》

前言OkHttp 就不做多余的介绍了,可说说是目前使用最广泛的网络请求框架,在很多的其他第三方框架中也是用了改网络请求框架例如Retrofit,这里主要想说一些问什么使用okhttp。一、为什么使用版OKHttp1.1 Socket如果我们需要从服务器获取一个资源,那么就一定需要访问网络,访问网络就一定需要使用到Socket,我想大家在学习Java的网络编程的时候也就是Socket 编程的时候一定写过客户端与服务端,客户端法一个消息然后服务端返回一个消息,就是一个极为简单的聊天软件,理论上我们可以通

2021-07-06 09:31:29 205

原创 Android Okhttp3《二》RetryAndFollowUpInterceptor

前言前一篇文章简单介绍了OkHttp 以及创建一个请求与请求执行过程,本编继续接着向下介绍一、责任链 private Response getResponseWithInterceptorChain() throws IOException { // Build a full stack of interceptors. List<Interceptor> interceptors = new ArrayList<>(); interceptors.a

2021-07-06 09:31:19 314

原创 Android Okhttp3《三》BridgeInterceptor

前言前一篇文章介绍了RetryAndFollowUpInterceptor,这一篇介绍OKHttp的第二个拦截器BridgeInterceptorBridge,桥,什么桥?按照官方对此类的注释所说:Bridges from application code to network code. First it builds a network request from a user request. Then it proceeds to call the network. Finally it buil

2021-07-06 09:31:08 139

原创 Android Okhttp3《三》CacheInterceptor

前言前一篇文章介绍了BridgeInterceptor,本篇我们介绍CacheInterceptor,望文知意,CacheInterceptor 肯定与数据的缓存有关系。一 HTTP 缓存在进入源码之前,这里需要介绍一下HTTP 协议中关于缓存控制的部分。1.1 Cache-Control1.1.1在请求中使用Cache-Control 时,它可选的值有:Cache-Control 是用于告诉浏览器或者是代理服务器关于使用缓存的一些方式,这个字段对于最终的服务器而言没有什么作用。app内部使

2021-07-06 09:30:57 226

原创 Android Okhttp3《四》CacheInterceptor之DiskLruCache

前言通过上一篇文章我们知道CacheInterceptor 最终使用DiskLruCache 将网络数据保存在本地次磁盘,这一篇我们就来研究一下DiskLruCache 的源码。一、DiskLruCache不想啰里啰嗦的介绍了,看名字就知道是用来在硬盘缓存数据的一个框架,DiskLruCache(Google官方编写,但获得官方认证。在进入源码之前,需要介绍一些相关的东西,否者直接读源码会读的雨里雾里。在DiskLruCache 有一个journal 文件,这个文件记录了每次读取操作的记录,类似

2021-07-06 09:30:46 242

原创 android Jetpack《三》Room(一)

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言Room的使用Room 数据库的创建一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言 Android 应用数据存储简单来说有这么几种:文件存储、SharedPreference 存储、SQLite 数据库存储,第三方的网上数据库存储。 当需要本地存储大

2021-07-06 09:30:11 158

原创 android Jetpack《三》Room之SQLiteOpenHelper

SQLiteOpenHelper 是什么 依照官方的解释就是一个用户管理数据库的帮助了,也就是用于数据库的增删改查的一个帮助类。 实际上在Android 里面对于数据库的操作都需要使用的这个类,包括第三方的各种orm框架,在底层依然还是使用的SQLiteOpenHelper 操作的数据库,当然Room框架也不会例外。  所以我们就从SQLiteOpenHelper 开始逐步进入Room框架一、创建数据可以看到获取读数据库与写数据库都是通过getDatabaseLocked 方法区别只是参数

2021-07-06 09:30:00 503

原创 android Jetpack Room之数据库的创建

  前面一篇介绍了Room的对于SqliteOpenHelper 的封装,本篇就来了解一下Room 框架中数据库的框架以及对SqliteOpenHelper封装之后 的使用。  由于Room框架使用的编译时注解,会在编译期间生成很多的类,所以这先贴出一个Room的使用范例示例// 定义表非常简单,只需要创建一个 class 并标记上 Entity 注解,// 可以使用它的 `tableName` 属性声明该表的名称@Entity(tableName = "table_cache")class

2021-07-06 09:29:50 1113

原创 android Jetpack Room之增删改查

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言  上一篇主要介绍了RoomDateBase的创建过程,本篇主要介绍的是对于Room对于数据库的操作的过程,虽然文章的标题是增删改查,但是四者之间的流程是差不多的,所以这里不会每个操作的流程都逐一分析。  Room对于数据库的操作一般都封装在一个使用@Dao注解的类里面,Dao全称data access object 翻译为中文就是数据访问对象。  本文依然采用上一章的例子@Daointerface CacheDaoTest

2021-07-06 09:29:36 772

原创 android Jetpack Room之数据库加密

数据加密  Android平台自带的SQLite有一个致命的缺陷:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。如果是普通的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的应用就会面临严重的安全漏洞隐患。加密方案第一种方案 在数据存储之前进行加载,在加载数据之后再进行解密,这种方法大概是最容易想的到,而且也不能说这种方式不好,就是有些比较繁琐。 如果项目有特殊需求的话,可能还需要对数据库的表明,列明也进行加密。第二种方法 对数据库整个文件进行加密

2021-07-06 09:29:17 2512 3

空空如也

空空如也

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

TA关注的人

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