自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android 学习笔记

Android 学习笔记最全 Android 常用开源库总结!Android DebugAdb常用命令收录Android studio 最全最好用的插件Android shape属性大全UMLAndroid改主题字体和字体大小Android Live Template(实时模板)的使用Android studio Debug设计模式GradleAppTheme属性设置集合Android中style和theme的区别Android Fragment 非常详细的一篇Fragment的replace、add、re

2020-10-15 17:30:31 1998 1

原创 Kotlin-JetPack-MVVM 从零开始搭建App

Kotlin-JetPack-MVVM 从零开始搭建App

2020-07-01 11:32:41 750

原创 Android进阶-Android第三方框架学习

Android第三方框架学习EventBus的使用参考链接1.定义EventMessage事件类。2. 在需要订阅事件的模块中,注册EventBus3.接收事件4.发送事件Subscribe 注解介绍EventBus的使用参考链接EventBus 使用(全面分析,细节提醒)一文彻底搞懂EventBus 3.0原理1.定义EventMessage事件类。public class EventMessage { private String messageType; private

2020-05-27 16:50:28 1291

原创 React Native 学习笔记

1.React Native 中如何实现根据state控制组件的显示与隐藏render() { return( { this.state.abc == null ? ( null ) : ( <View> ...

2019-09-11 15:13:22 414

原创 Bitmap优化

ConfigConfig表示位图像素的存储格式,什么意思呢? 就是bitmap在屏幕上显示的每一像素在内存中存储的格式,会影响Bitmap真实图片的透明度以及图片质量;Bitmap.Config.ALPHA_8:颜色信息只由透明度组成,占8位;Bitmap.Config.ARGB_4444:颜色信息由透明度与R(Red),G(Green),B(Blue)四部分组成,每个部分都占4位,总共占16位;Bitmap.Config.ARGB_8888:颜色信息由透明度与R(Red),G(Gre

2022-04-01 16:56:10 416

原创 Git学习

Git常用指令为什么要使用git pull --rebase?git cherry-pick 详解cherry-pick挑拣提交

2022-03-30 14:22:01 205

原创 依赖倒转原则

依赖倒转原则高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。下面看一个例子来理解依赖倒转原则【例】组装电脑现要组装一台电脑,需要配件cpu,硬盘,内存条。只有这些配置都有了,计算机才能正常的运行。选择cpu有很多选择,如Intel,AMD等,硬盘可以选择希捷,西数等,内存条可以选择金士顿,海盗船等。类图如下:代码如下:希捷硬盘类(XiJieHardDisk):pu

2022-02-20 20:39:36 253

原创 数据结构基础

数组数组的另一个特点,是在内存中顺序存储,因此可以很好地实现逻辑上的顺序 表。数组在内存中的顺序存储,具体是什么样子呢?内存是由一个个连续的内存单元组成的,每一个内存单元都有自己的地址。在这些内存单元中,有些被其他数据占用了,有些是空闲的。数组中的每一个元素,都存储在小小的内存单元中,并且元素之间紧密排列, 既不能打乱元素的存储顺序,也不能跳过某个存储单元进行存储。数组的插入和删除操作,时间复杂度分别是多少?先说说插入操作,数组扩容的时间复杂度是O(n),插入并移动元素的时间复杂度也是O(n),

2022-02-19 20:47:25 368

原创 Android进阶-Context

Context都没弄明白,还怎么做Android开发?Android Context完全解析,你所不知道的Context的各种细节扒一扒 Context一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。Activity,Application,Service虽都继承自ContextWrapper(Activity继承自ContextWrapper的子类Conte

2022-02-19 20:43:18 196

转载 Android编译时注解框架(四)-爬坑

Android编译时注解框架-爬坑概述因为有关APT的资料过少,又因为是Java Moudle +Android Moudle的使用方式,在项目编写过程中,会有一些匪夷所思的奇怪问题~入门阶段真的是步履维艰。这篇博客就是编写《Android编译时注解框架》系列中,将所遇到的一些坑列举出来,并给出一些绕过坑的方法。(注意哦是绕过,坑还在,没有填因为不知道这坑咋来的……)随时踩坑,随时更新~坑1:无法引入javax包下的类库编写编译时注解框架时,需要用到javax包下的一些类库,但是引入包时却提示

2022-02-08 17:15:30 605

转载 Android编译时注解框架(三)-Run Project

Android编译时注解框架-Run Project概述因为编译时注解框架前期项目搭建部分需要较多的图文讲解,所以前一章《Android编译时注解框架-Run Demo》只是实现了最简单应用,或许注解信息,并没有生成代码。本章将以生成代码为重点进行一个案例讲解。框架名称:OnceClick**框架功能:**功能就是它的名字:在一定时间内,按钮点击事件只能执行一次。未到指定时间,不执行点击事件。**框架背景:**从用户的角度,在使用应用的过程中,因为低端机性能原因、Web页面性能问题,导致点击按

2022-02-08 17:14:19 196

转载 Android编译时注解框架(八)-APT的优缺点与应用

Android编译时注解框架6-APT的优缺点与应用概述如果你已经读完了前面的5章博客,相信你已经对APT整体已经比较熟悉了,所以,APT真的很简单对嘛?但就像我前面提到过的,APT是一套非常强大的机制,它唯一的限制在于你天马行空的设计!APT有着非常简单的技术实现,但其应用场景却着实有点尴尬。我一直期望可以探索出ButterKnife和EventBus以外的应用场景,却始终未能如愿。姑且把我目前总结的成果列举,共勉~(本系列所讲APT均泛指编译时注解+代码生成,虽然运行时注解也属APT)APT

2022-02-08 17:08:05 740

转载 Android编译时注解框架(七)-Hook Crash框架CakeRun

Android编译时注解框架-Hook Crash框架CakeRun1.概述Crash对用户体验的影响是致命的。想象一下几个场景:引用了新的框架,在Application中初始化,框架崩了,haha~开心不?你的应用连启动都做不到了,热更新强更新起不到任何作用。用户只能卸载掉你的应用重新下载。那么问题来了,若不是强需,卸载后还有多少用户会去下载?一个非关键路径页面里非常小的Bug引起的奔溃。说实话这个页面的功能它根本无足轻重,但问题是就因为这个,你应用的奔溃率刷刷上涨,BOSS看着能高兴?

2022-02-08 17:07:49 228

转载 Android编译时注解框架(六)-数据库ORM框架CakeDao

Android编译时注解框架-数据库ORM框架CakeDao1.概述采用一个ORM数据库框架来进行数据持久化操作几乎是现在所有APP的选择。那么最受欢迎的的ORM数据库框架有哪些呢?GreenDao、OrmLite、Active Android 等等等等~好吧,那么问题来了,既然已经有很多成熟的ORM数据库框架了,那我还在写一个有什么必要么?有的,简单分析一下上面的三个:OrmLite、Active Android:这两个框架异曲同工,虽然使用方式有差别,但都广泛的应用了注解来实现ORM操作

2022-02-08 17:07:27 488

转载 Android编译时注解框架(五)-语法讲解

Android编译时注解框架-语法讲解概述本章内容主要对APT一些语法进行简单讲解。apt的学习资料真的太少了,我的学习方法基本上只能通过看开源库的源码猜、看源码注释猜、自己运行着猜……这里对猜对的结果进行一个总结,让后来者可以更快的上手。第一次写这种类型的博客,总结的可能有些分散,建议结合开源库源码学习。自定义注解相关定义注解格式: public @interface 注解名 {定义体}Annotation里面的参数该设定:第一,只能用public或默认(default)这两个访问权

2022-02-08 17:07:05 317

转载 Android编译时注解框架(二)-Run Demo

Android编译时注解框架-Run Demo概述先讲一下编写《Android编译时注解框架》的初衷吧,APT其实并不难,可以说是简单且高效,但关于APT的资料却并不多,甚至很多人都不知道这么一个技术。国内关于APT的博客屈指可数,唯二找到的几篇初级讲解一个是用Eclipse写得,一个是用AndroidStudio加Intellij。刚开始着实踩了不少坑,但事实是,APT完全可以用AndroidStudio单独实现。光是项目搭建就如此麻烦了,更别提语法讲解了。资料匮乏无疑提高了APT的入门门槛。正因为

2022-02-08 17:06:20 172

转载 Android编译时注解框架(一)-什么是编译时注解

Android编译时注解框架-什么是编译时注解概述Android编译时注解框架从入门到项目实践。该系列将通过5篇博客一步步教你打造一个属于自己的编译时注解框架,并在之后开源出基于APT的编译时注解框架。提到注解,普遍都会有两种态度:黑科技、低性能。使用注解往往可以实现用非常少的代码作出匪夷所思的事情,比如这些框架:ButterKnife、Retrofit。但一直被人诟病的是,运行时注解会因为java反射而引起较为严重的性能问题…今天我们要讲的是,不会对性能有任何影响的黑科技:编译时注解。也有人叫它

2022-02-08 17:05:25 562

原创 Android 进阶

retrofit源码阅读Android进阶-设计模式-动态代理模式Android:这是一份全面 & 详细的Retrofit 2.0 源码分析指南okHttp源码阅读设计模式-责任链模式彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想从通信流程聊OkHttp拦截器从一次请求开始,深入探索OkHttpOPPO互联网技术-OkHttp源码深度解析...

2021-08-02 11:44:03 87

原创 Android 搭建私有maven仓库及上传项目

参考链接前言在日常工作及项目迭代过程中,一定有不少同学自己写了一些框架性的东西,或者一些好用的工具,总之就是能复用的代码。然而也有不少同学为了复用这些代码不得不复制粘贴到不同项目中,这样相同的功能出现了多份代码,在后期的维护过程中带来极度不便,更新一次SDK要口口传送多次且无法按版本迭代和降级。为了解决这一系列问题,我们不妨尝试将这些代码部署到maven仓库,一处编写多处使用。Nexus 介绍Sonatype Nexus 是一个常见的搭建本地私有仓库的工具,详情进入官网查看(建议使用科学上网)。h

2021-05-28 10:14:25 784 1

原创 Android进阶-HTTPS通信原理-非对称加密

对称加密简介:对称加密算法又称传统加密算法,加密和解密使用同一个密钥。加密解密过程:明文->密钥加密->密文,密文->密钥解密->明文。缺点:对称加密算法是不现实的,互联网中通信的双方大多是临时建立的连接,不可能提前协商好密钥,而且密钥也要进行传输,无法保证密钥本身的安全性。非对称加密简介:非对称加密(asymmetric cryptography),也称为公开密钥加密(Public-key cryptography),是密码学的一种算法,它需要两个密钥,一个

2021-05-02 21:03:59 1104 1

原创 Android进阶-Activity

standard(标准模式) 系统不会在乎这个活动是否已经在返回栈中存在,而是每次启动活动都会创建该活动的一个新的实例。singleTop (栈顶复用)在启动活动时,如果发现该返回栈的栈顶已经是该活动时,则认为可以直接使用它,不会在创建新的活动实例singleTask (栈内单例)每次启动该活动时,首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在就直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。singleInstance (堆内单例) 会启用一

2021-04-27 22:07:13 174

原创 DataBinding-ViewModel-LiveData-Koin 使用

引入依赖app/build.gradle buildFeatures { dataBinding = true } // liveData implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' // viewModel implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' implementa

2021-04-10 15:39:04 242

原创 Java-匿名内部类

2021-03-31 11:50:04 62

原创 Android Jetpack - Navigation

本文章结束后完成的效果导入库Deps.kt const val navigation = "2.0.0" const val navigation_ui = "2.1.0" const val navigation_fragment ="androidx.navigation:navigation-fragment-ktx:${Versions.navigation}" const val navigation_ui = "androidx.navigation:n

2021-03-24 20:33:47 153

原创 Gradle常用

sourceSets需要不同渠道对应不同src lib res的时候,包括debug,release要分离时,可以用下面的方法设置:sourceSets{ main { assets.srcDir "src/main/assets" manifest.srcFile "src/main/AndroidManifest.xml" debug { jniLibs.srcDir 'src/main/jniDe

2021-03-23 13:58:47 79

原创 Android进阶-设计模式

设计模式六大原则单一职责原则定义: 一个类只有一个原因引起变化。也就是一个类只有一个职责,它就只负责一件事情。通俗理解: 例如类 A 负责两个不同的职责,分别是职责 B1 与职责 B2,当职责 B1 需要修改时,就会导致类 A 的修改,这样就有可能影响到职责 B2 的功能。为了解决修改职责 B1 影响职责 B2 的功能就有了“单一职责原则”,也就是可以根据“单一职责原则 ”分别创建类 A1 和类 A2,然后类 A1 负责职责 B1,类 A2 负责职责 B2,这样就解决了相互影响的问题。好处: 类的

2021-01-30 22:37:04 475

原创 Android进阶-Java向上转型

很多人在初次接触设计模式的时候,最大的疑惑莫过于碰到这样的句子:(父类C和子类C1) // 父类引用指向子类对象:父类名 对象名=new 子类名(); C c = new C1();// 相当于C c = new C ();C1 c1 = new C1();c = c1;这种用法叫做“父类引用指向子类对象”,或者叫“父类指针指向子类对象”,指的是定义一个父类的引用,而它实际指向的是子类创建的对象。功能上相当于子类的“向上转型”。向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子

2021-01-30 14:51:02 105

原创 Android进阶-Handler源码解析

Handler深入理解MessageQueueHandler发送消息的方式Handler类中发送消息-post()和postDelay()方法精炼详解

2021-01-28 15:18:55 665

原创 Kotlin

目录文章主要参考链接var 与 vallateinit和lazylateinit 的使用lazy 的使用Elvis操作符函数示例单表达式函数扩展函数嵌套类与内部类嵌套类(Nested Class)内部类(Inner Class)小结一下嵌套类和内部类类的构造函数主构造函数二级构造函数同时存在主构造函数和二级构造函数时的情况继承类的基础使用继承类的构造函数无主构造函数存在主构造函数重写方法重载覆盖规则接口数据类使用数据类修改数据类属性解构声明抽象类使用抽象类LambdaLambda介绍无参数的情况有参数的情况

2021-01-19 20:39:59 744

原创 Android进阶-Gradle

百度App技术 - Gradle 与 Android 构建入门 Gradle 爬坑指南 – 概念初解Android Gradle (一)Gradle的Android插件入门Android Gradle (二)签名配置和依赖管理Gradle是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译Java有Java插件,编译Groovy有Groovy插件,编译Android APP有Android APP插件,编译Android Library有Android

2020-11-20 17:27:42 888

原创 Android进阶 - 自定义View

View和ViewGroupView是Android所有控件的基类,同时ViewGroup也是继承自View。ViewGroup作为View或者ViewGroup这些组件的容器,派生了 多种布局控件子类,比如LinearLayout、RelativeLayout等Android坐标系Android视图坐标系View获取自身宽高getHeight():获取View自身高度getWidth():获取View自身宽度MotionEvent提供的方法我们看上图那个深蓝色的点,假设就是我们触

2020-11-12 16:28:20 336

原创 sourcetree for mac 过滤提交的文件

参考链接:sourcetree for mac 过滤提交的文件利用git的提交代码的时候,有些文件夹是不需要提交的,比如说依赖包、压缩包、打包文件、demo等。这时候就需要进行设置过滤提交的文件。以下以mac版的sourcetree为例进行说明。1、设置 — 高级 — 仓库指定忽略列表2、编辑“仓库指定忽略列表”,此时编辑的是一个 .gitignore的文件,编辑完.gitignore文件后然后点击确定。3、完成配置后sourcetree会提示你, .gitignore 文件有更新,将其提交

2020-08-07 15:13:28 858

原创 Android之使用Kotlin构建Gradle

buildSrc在项目根目录下新建一个名为buildSrc的文件夹(与项目里的app文件夹同级)。在buildSrc文件夹里创建名为build.gradle.kts的文件plugins { `kotlin-dsl`}repositories { jcenter()}在buildSrc文件夹里创建src/main/kotlin文件夹,在src/main/kotlin目录下新建一个包,并在该包下创建kt文件(Dep.kt)。如下图所示...

2020-07-02 17:18:37 894

转载 Kotlin系列之let、with、run、apply、also函数的使用

全文参考链接-Kotlin系列之let、with、run、apply、also函数的使用内联扩展函数之letlet扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。在函数块内可以通过 it 指代该对象。返回值为函数块的最后一行或指定return表达式。使用结构object.let{ it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法

2020-06-29 17:45:37 164

原创 Android进阶-Android的内存泄漏

java的内存栈区、堆区、静态区/方法区1、栈区:由编译知器自动分配释放,存放函数的参数值、局部变量的值等、基本类型的变量,例如int a=3中的a、对象的引用变量,例如Thread t=new Thread()中的t、具体方法执行结束之后,系统自动释放JVM内存资源。2、堆区:一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时道查看这个对象,如果没有引用指向这个对象就内回收。3、静态区/方法区:存放全局变量,静态变量和字符串常量,不释放和整个应用的生命周期一样。堆内存和栈内存,两者

2020-05-18 17:37:35 309

原创 Gson的基本使用

Gson的基本使用序列化反序列化List值为null时,序列化/反序列化控制序列化/反序列化 的变量名称序列化/反序列化过程中忽略某些变量方法1: 可以使用Gson提供的@Expose注解方法。使用方法如下方法2: transient关键字 ,使用这个关键字,可以直接让变量不参与序列化/反序列化,如下:序列化使用Gson将它序列化时,直接返回StringGson gson = new Gson();String userJson = gson.toJson(object);反序列化 Strin

2020-05-15 16:50:46 192

转载 gradle使用技巧(def定义变量 rootProject.ext 添加全局变量)

在主app目录下的build.gradle中我们可以这样写:def packageTime() { return new Date().format("yyyy-MM-dd")}def versionMajor = 1def versionMinor = 1def versionPatch = 0android { compileSdkVersion rootProj...

2020-05-06 11:34:10 1020

转载 关于Android studio里ext中的$rootProject的总结

参考链接gradle统一入口版本管理的初衷是解决一个项目只要一个地方修改,各个有引用的模块便可以自动生效,从而达到了一个地方修改各个地方生效的好处,同时能保持gradle引用库版本的一致。使用方法如下:1.首先在项目级别的build.gradle文件底部添加如下信息:ext{ // Sdk and tools minSdkVersion = 15 targetSdkV...

2020-05-06 11:22:09 545

原创 Android进阶- 网络编程学习

参考链接TCP/IP 四层模型应用层:SMTP、FTP、HTTP传输层:TCP、UDPTCP与UDP区别总结1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付。3、TCP面向字节流,实际上是TCP把数...

2020-05-04 23:23:04 743

原创 Android进阶 - ViewGroup事件分发机制

鸿洋版ViewGroup事件分发机制案例添加一个自定义的LinearLayout:package com.example.zhy_event03; import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEven...

2020-04-21 17:55:55 541

空空如也

空空如也

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

TA关注的人

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