自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 OkHttp内部流程解析

最近在看okhttp源码,这个流程度总结的很棒,记录一下~

2020-12-14 16:19:30 217

原创 Java中switch为什么不能用long类型

在底层上,无论是int和enum还是short、 char 或者 byte他会自动转换为int的,实际上只对整型有效,long类型范围比int大很多,因此不能转为int比较

2020-12-08 19:52:52 1302

原创 APP基本性能优化

布局优化避免OverDraw过渡绘制优化布局层级避免嵌套过多无用布局当我们在画布局的时候,如果能实现相同的功能,优先考虑相对布局,然后在考虑别的布局,不要用绝对布局。使用标签把复杂的界面需要抽取出来使用标签,因为它在优化UI结构时起到很重要的作用。目的是通过删减多余或者额外的层级,从而优化整个AndroidLayout的结构。核心功能就是减少冗余的层次从而达到优化UI的目的! ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。代码优化使用A

2020-07-28 16:55:40 490

原创 java四种引用分类

强引用:代码中普遍存在的,只要强引用还存在,垃圾收集器就不会回收掉被引用的对象。软引用:SoftReference,用来描述还有用但是非必须的对象,当内存不足的时候会回收这类对象。弱引用:WeakReference,用来描述非必须对象,弱引用的对象只能生存到下一次GC发生时,当GC发生时,无论内存是否足够,都会回收该对象。虚引用:PhantomReference,一个对象是否有虚引用的存在,完全不会对其生存时间产生影响,也无法通过虚引用取得一个对象的引用,它存在的唯一目的是在这个对象被回收时可以收到.

2020-07-25 11:47:09 172

原创 JVM基本构成

1.类加载器(ClassLoader):在JVM启动时或者在类运行将需要的class加载到JVM中。(下图表示了从java源文件到JVM的整个过程,可配合理解。2.执行引擎:负责执行class文件中包含的字节码指令;3.内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。运行时内存区主要可以划分为5个区域,如图:方法区(MethodArea):用于存储类结构信息的地方,包括常量池、静态常量、构造函数等。虽然JVM规范把方法区描述为堆的一个辑部分, 但它却有个别名non-heap(非

2020-07-25 11:44:03 273

原创 Gradle 生命周期的各个回调

2020-07-20 11:50:12 303

原创 https连接流程(图)

2020-07-20 11:13:36 654

原创 一个小插件,根据注解自动生成说明文档

一、背景我们app里有很多事件埋点,pm经常会来问某个操作埋点了吗,埋点值是啥啊,经常会需要在代码里找,虽然我们有自己的埋点录入平台,但是需要手动输入,为了提高效率,写了一个小插件,用自定义注解的形式,在build的时候,自动将被注解的埋点统一输出到一个文档里,方便查找。目前功能比较简单,只能固定路径生成txt文档,后续会支持更多功能。二、原理主要是自定义注解处理器来实现的,学习了这篇文章三、用途:用注解标注需要说明的变量,编译后自动在当前项目根目录生成文档。四、使用方法添加依赖在ap

2020-07-17 18:11:27 389

原创 kotlin内置函数let、also、with、run、apply记录

let函数also函数类似let函数,但区别在于返回值:let函数:返回值 = 最后一行 / return的表达式also函数:返回值 = 传入的对象的本身with函数调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可 with(object){ // ... }// 返回值 = 函数块的最后一行 / return表达式run函数结合了let、with两个函数的作用,即:调用同一个对象的多个方法 / 属性时,可以省去..

2020-07-07 11:19:08 313

原创 kotlin的简约lambda

kotlin的lambda可以很简约://正常情况view.setOnClickListener({ v -> v.setVisibility(View.INVISIBLE) })//当lambda是函数的最后一个参数时,可以将其移到括号外面view.setOnClickListener() { v -> v.setVisibility(View.INVISIBLE) }//当函数只有一个lambda类型的参数,可以去省去括号view.setOnClickListener { v -

2020-06-27 16:54:22 143

转载 泛型擦除以及类型安全

带你深挖Java泛型类型擦除以及类型擦除带来的问题这篇文章写的很好,通俗易懂,转载记录一下。

2020-05-26 15:53:08 131

原创 Java锁相关

为什么Java中需要“锁”?Java支持多线程访问,对于一个公共资源,如果多个线程同时对其进行读写操作,就会发生程序混乱,造成未知的bug,所以需要对这个公共变量资源加锁,让各个线程按顺序对这个资源进行操作,避免发生数据不一致的情况出现,保证其唯一性和准确性。锁的分类1.乐观锁 VS 悲观锁对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。

2020-05-25 19:54:39 164

原创 kotlin中类怎么禁止外部通过构造器创建实例

在Java中,如果不想让外部通过类的构造方法来创建实例对象的话(单例模式中经常见),一般会将构造方法声明为private:class A { ... private A(){ } ...}那么在kotlin中怎么写呢,其实道理是一样的,都是私有化构造方法,只不过写法有一些变化:class A private constructor() { ... companion object { fun getInstance(): A {

2020-05-20 15:36:51 807

原创 Android-Activity中setContentView流程解析

在Activity中加载布局的时候,我们都知道调用的是setContentView方法,那么具体是如何实现的呢?本文基于参考其他人博客以及自己翻阅源码做一个记录。随便找到一个Activity,点击setContentView方法可以看到实现:public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID);//1 initWindowDecor

2020-05-09 11:03:43 614

原创 Java泛型-基础理解

在开发过程中经常会看到范型或者使用到范型,所以基于自己的理解,拆分几篇文章由浅入深记录一下。为什么需要范型?范型这个概念,是在JDK1.5引进来的,其实可以把它理解成一个语法糖,它解决的是什么问题呢?举个栗子:假如有以下一个场景,我们需要一个容器类,支持存取不同类型的对象,最基本的实现可能是创建这样一个类:public class Container{ public Container...

2020-04-28 15:56:05 211

原创 flutter/dart 语法点记录

1.??=运算符 如果 ??= 运算符前面的变量为null,则赋值,否则不赋值 var param1 = "hello", param2 = null; param1 ??= "world"; param2 ??= "world"; print("param1 = $param1"); // param1 = hello print("param2 = $param2"); /...

2020-04-28 11:16:12 263

原创 Android Studio运行flutter项目,点击方法名提示Cannot find declaration to go to

在github找了个flutter的demo准备学习下,跑起来之后发现代码很多关键字都没有高亮了,点击也不能跳转、关联源码,搜了一下,以下办法解决了我的问题:删除项目根目录下的.idea文件夹File/Close Project,如果此刻你开了多个项目,最好全部完全退出重启打开as启动你的flutter项目经过以上三步,问题解决,备注一下。...

2020-04-27 15:24:07 2540

原创 HashMap实现原理记录

HashMap实现原理基于jdk1.8深入了解HashMap底层原理。1.put实现流程final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int ...

2020-03-11 14:45:48 146

原创 ClassLoader双亲委托机制流程

在加载类的时候,Java建议使用双亲委托这种模型,流程其实很简单:加载器收到加载类的请求后,判断要加载的类是否已经存在如果不存在的话,委托给父类加载器父类加载器如果还有父类加载器,重复2如果父类加载器找不到该类,抛出ClassNotfoundException子类加载器调用findclass()方法自行加载...

2019-07-30 16:08:03 145

原创 Android进程间通信机制Binder学习

Android 系统是基于 Linux 内核的,Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC (跨进城通信)机制。但是由于性能、稳定性和安全性几方面的原因,Android系统设计了Binder机制来实现IPC.性能稳定Binder 基于 C/S 架构,客户端(Client)有什么需求就丢给服务端(Server)去完成,架构清晰、职责明确又相互独立,自然...

2019-02-17 13:23:12 246

原创 补间动画-translate

使用步骤:1.在res/anim/下定义动画文件,例如取名为translate.xml。&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" ...

2019-01-19 11:23:40 147

原创 AsyncTask执行流程总览

用户调用task.execute() =&gt;onPreExecute()=&gt;交给线程池sDefaultExecutor调度=&gt;mFuture 配合 mWorker开启子线程=&gt;doInBackground()=&gt;交给内部单例InternalHandler处理返回结果并返回到主线程=&gt;根据Message处理onProgressUpdate()或onPos...

2018-12-24 17:45:45 215

原创 flutter混合开发运行报错:VM snapshot must be valid. /Check failed: vm. Must be able to initialize the VM.

E/flutter (13214): [ERROR:flutter/runtime/dart_vm.cc(259)] VM snapshot must be valid.F/flutter (13214): [FATAL:flutter/shell/common/shell.cc(212)] Check failed: vm. Must be able to initialize the VM....

2018-12-10 16:44:43 2966 1

原创 flutter-Mac系统下安装之export PATH=`pwd`/flutter/bin:$PATH

明天实践,然后写下整个过程。

2018-12-08 21:40:54 2841

原创 RxJava2随记(1)

两种订阅方式:1.Flowable与Subscriber2.Observable与Observer主要区别:Observable不支持背压,而Flowable支持背压。两者选择官方建议:1.使用Observable - 不超过1000个元素、随着时间流逝基本不会出现OOM - GUI事件或者1000Hz频率以下的元素 - 平台不支持Java Steam(Java8新特性) - Obse...

2018-10-12 10:33:52 128

原创 正确的“懒汉式”单例写法

public class Singleton { private volatile static Singleton INSTANCE; //声明成 volatile private Singleton (){} public static Singleton getSingleton() { if (INSTANCE == null) { ...

2018-09-26 18:15:44 572 1

原创 Android基础知识-布局优化

在Android中界面绘制是比较费时的,尤其是嵌套比较复杂的界面,所以我们会用一些技巧来优化布局。Android提供了以下标签或控件来供我们优化布局:1.&amp;amp;amp;amp;amp;amp;amp;lt;include&amp;amp;amp;amp;amp;amp;amp;gt;这个标签允许我们在当前布局文件中,引用另一个布局文件。最常见的一个例子就是页面头布局,我们经常会封装一个统一样式的布局(比如包含标题,以及左右操作按钮等),然后在需要的界面,使用&am

2018-09-19 15:34:32 256

原创 一步一步实现Android低功耗蓝牙(BLE)基本开发

项目需要接入两个低功耗蓝牙设备(BLE),并且与之交互(读/写)数据,所以看了下官方对于这块儿的介绍,总结了一下ble开发中一些需要注意的地方以及基本流程。 BLE开发需要Android 4.3 (API level 18) 及以上一.添加权限 为了能正常使用蓝牙相关功能(扫描等),首先需要添加以下权限:&amp;lt;uses-permission android:name=&quot;and...

2018-09-13 18:29:10 3833 3

原创 Android Studio 启用lambda表达式

AS version:3.1.3 在对应moudle的build文件中android 节点下添加以下代码即可启用:compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 }

2018-09-13 16:21:12 257

原创 mac下SourceTree出现错误:fatal: could not read Username for 'xxx': Device not configured

昨天使用SourceTree提交代码的时候突然遇到了一个错误:fatal: could not read Username for 'xxx': Device not configured之前一直都是好的,但是用Android Studio提交代码是可以的。回想了一下,可能是因为捣鼓mac自带的钥匙串,导致SourceTree使用其中存储的密码的时候出现了问题。 花了些时间Googl...

2018-09-05 09:28:10 6480

原创 Android自定义View-记录一个简单却又常见的效果实现

上周遇到一个需求,用一个圆形进度条的形式来展示某项操作所占的比例,虽然类似的轮子已经有很多了,但是这种简单的自定义View个人觉得有时间的话,还是自己写写比较好。首先来看一下效果图: 分析: 从效果图可以看到,这个效果整体分为以下几部分:背景圆环进度圆弧终点小圆圈(进度为0和进度为100%的时候应当没有)内部三行文字怎么实现: 分析出整体框架之后,思路其实已...

2018-09-01 12:32:12 5400 2

原创 PHP中字符串包含引号的情况

声明字符串类型的变量的时候,如果包含变量可能有一下几种情况。单引号中嵌套双引号$str_string1 = 'hello "php" ';双引号中嵌套单引号$str_string2 = "这里藏了'单引号'";单引号中嵌套单引号$str_string3 = '单引号里'还有'单引号';双引号中嵌套双引号$str_string4 = "双引号里"还...

2018-08-11 17:19:16 3504

原创 Volley从源码梳理主要工作流程

话说Volley这个框架可出来5年了,大佬大佬……1.创建网络请求队列RequestQueue requestQueue=Volley.newRequestQueue(context)2.创建各种类型的请求StringRequest,ImageRequest,JsonRequest,JsonObjectRequest,JsonArrayRequest,...3.将...

2018-08-08 15:29:33 119

原创 MVP简记

大多数开发场景的套路都是这样:用户通过ui界面触发某个操作,从本地或者网络获取数据之后再在界面上展示出来,如果逻辑比较复杂,那么获取数据这步代码可能就会比较多,如果全部写在Activity或者Fragment中,就会显得很臃肿。在MVP这种开发模式中,可以将代码分为三个角色:Model,View,Presenter:Model 理解为对应数据层,将大部分的业务逻辑层放在这里。Vie...

2018-07-20 15:05:55 156

原创 ScrollView里面基于某个View弹出PopupWindow,PopupWindow不会跟着View滚动?

遇到这样一个需求:根布局为ScrollView,内部有一个TextView,叫它A,需要在A正上方弹出一个PopupWindow。 初看其实很简单,根据A的位置和大小,算出PopupWindow的位置,调用showAtLocation方法即可实现在A正上方弹出。 代码如下:showPopAlongView(textView);private void showPopAlongVie...

2018-06-29 09:58:07 1991

原创 Android 8.0系统上使用WindowManager添加view的一个问题

如图,app有个功能,用户设置一个定时,到时后会弹窗提示。实现很简单,注册SYSTEM_ALERT_WINDOW权限,使用WindowManager对象调用addView(view, para)添加view即可。WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WIN

2017-12-20 15:06:14 8174 1

原创 Android Studio3.0多渠道打包遇到的问题

最近升级到了Android Studio3.0,在给测试打包的时候突然出错,错误如下:Error:Cannot choose between the following configurations of project :UMUpdate: - debugApiElements - debugRuntimeElements - releaseApiElements

2017-12-12 13:20:55 1037

原创 Mac下PHP依赖管理工具Composer下载与安装

1.下载 依次执行以下命令php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fd

2017-12-04 13:17:35 349

原创 PHP基础知识点

1.PHP 变量规则: 1. 变量以 $ 符号开头,其后是变量的名称 2. 变量名称必须以字母或下划线开头 3. 变量名称不能以数字开头 4. 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)2.PHP 是一门类型松散的语言 在上面的例子中,请注意我们不必告知 PHP 变量的数据类型。 PHP 根据它的值,自动把变量转换为正确的数据类型。 在诸如 C 和 C++

2017-12-04 10:56:47 238

原创 从源码梳理Retrofit网络请求过程

通过定义一个接口,在方法上加入相关注解,Retrofit框架就可以把它解析成对应的网络请求,使用非常方便,记录下从源码角度看这个过程是怎么实现的。一 Retrofit的引入在Android Studio中引入Retrofit非常方便,目标最新版本是2.3,在app-build文件-dependencies节点下加入以下依赖即可: compile 'com.squareup.retrofit2:

2017-12-03 13:49:08 247

空空如也

空空如也

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

TA关注的人

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