自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 组件化之注解处理器

一、项目结构项目结构需要有注解工程(属于Java工程)、注解处理工程(属于Java工程),如下图所示:二、APT技术简介APT(Annotation Processing Tool) 是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解自动生成代码,如果想要自定义的注解处理器能够正常运行,必须要通过APT工具来进行处理。(总而言之,就是通过注解自动生成Java代码)三、如何确保注解处理程序编译OK如下图所示,ARouterProcessor.java 在META-

2021-05-04 11:13:38 154

原创 组件化

一、组件化的介绍组件化的意义:不相互依赖,可以相互交互,任意组合,高度解耦,自由拆卸,自由组装,重复利用,分层独立化。

2021-04-15 17:17:54 399

原创 启动耗时优化

一、启动耗时统计am start -S -W com.example.health/.LoginActivity-S 参数为先停止,然后再次进行启动,-S顾名思义为Stop的意思

2021-04-13 15:39:58 222

原创 Android 内存优化

一、Java内存分配模型二、Java对象声明周期1、创建:为对象分配内存,构造对象2、应用:此时对象至少被一个强引用持有3、不可见:程序本身不再持有这个对象,但是该对象还依然存在4、不可达:GC对该对象进行可达性分析(判断对象是否为垃圾),发现不可达,然后就会把该对象归纳成不可达状态...

2021-04-11 17:33:30 105

原创 性能优化之数据结构

一、ArrayList性能分析ArrayList底层是用数组进行实现的,顺序表假设向index=10的位置添加一个元素 “lgj”如果arr[10] 为空的话,那么就直接赋值 a[10] = “lgj”如果arr[10] 不为空的话,先进行元素位移,然后再向index=10的位置进行赋值a[10] = “lgj”如下图所示:元素位移比较损耗性能如果每次添加和删除元素都是在末尾进行操作,那么这个也不损耗性能查询比较快,为什么数组的访问比较快呢?因为连续内存int 类型的 elementD

2021-04-02 10:12:50 177

原创 Android ANR 总结

一、Android ANR概念不论从事安卓应用开发,还是安卓系统研发,应该都遇到应用无响应(ANR,Application Not Responding)问题,当应用程序一段时间无法及时响应,则会弹出ANR对话框,让用户选择继续等待,还是强制关闭。二、常见的ANR 类型:第一种:KeyDispatchTimeout:最常见的一种类型,原因是View事件或者触摸事件在特定时间内(5s)无法得到响应第二种:BroadcastTimeout:BroadcastReceiver的onReceive函数运行

2021-03-20 18:41:51 425

原创 Handler 源码分析

一、生产者与消费者Android开发中,经常在子线程中进行一些操作,当操作完成之后会通过Handler发送一条消息给主线程,通知主线程做出相应的操作,其背后原理,是一个经典的生产者与消费者模型,生产者和消费者在同一时间内共用同一个存储空间,生产者往存储空间中添加消息,消费者从存储空间中取出消息。如下图所示,这个是Handler工作的基本原理。二、为什么主线程创建Handler不用调用Looper.prepare() Looper.loop()因为在我们APP启动的时候,系统已经帮我们调用了。pub

2021-02-27 16:53:45 78

原创 ViewPager + Fragment 架构中如何处理预加载问题

1、由于ViewPager设置setOffscreenPageLimit(0)无效,导致当前缓存的Fragment的数量总是 limit * 2 + 1 个,假设 setOffscreenPageLimit(1)设置的是1,然后当前选中的是第一个Item,此时它也会把下一个Item对应的Fragment加载出来,并且走完该有的声明周期,如上图所示2、分析原因是因为,这个是ViewPager的机制,始终会至少缓存2个Fragment,如何处理这个问题呢,接下来分析。首先,搞明白整个调用流程,当我们

2021-02-13 23:29:02 408

原创 Android自定义控件绘制鱼,并且模拟鱼游动

整体代码鱼的游动还是不太明白,抄的享学老师的代码,先这样吧先上效果图:画鱼的代码package com.lgj.xxkt.ui;import android.animation.ValueAnimator;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.Path;import android.

2021-02-12 09:36:40 404

原创 ConstraintLayout 可以解决布局嵌套问题

一、先演示简单的使用实现如下效果图:<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http

2021-02-06 20:03:04 765

原创 Android 从源码的角度分析事件分发流程

一、这里讲的是单点触摸,一个事件序列是由 down – move – up 组成1、首先当手指点击屏幕的时候,Activity会拿到这个事件,经过一层一层的分发,最终才能到达View上。// 这个就是Activity的dispatchTouchEvent方法public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onU

2021-01-31 22:56:02 85

原创 Android 11(R)的分区存储

一、Android 存储方式的演变1、随着Android版本的升级,私有目录(/data/data/package/)的存储方式没有发生改变,当应用卸载之后,这部分的内容也随之删除,变化的是外置卡的存储方式,下面我们讲的内容都是针对外置卡的存储方式而言。2、Android 9 外置卡存储方式,每个应用都可以访问,包括增删改查(当然这个APP已经申请了读写外置卡的权限)。3、Android 10 对分区存储做了一个过渡,你可以选择分区存储也可以不选,如果在Application的节点中设置这个属性为tr

2021-01-23 13:26:53 2627

原创 Android 文字的绘制,应用歌词

一、文字的绘制机制文字绘制机制是基于文字的baseline绘制的,baseline又是什么,看下图所以 下面这种方式,文字是看不见的,因为baseline的坐标是0canvas.drawText("李国菁",0,0,paint);二、设置文字对齐方式第一种方式设置水平居中paint.setTextAlign(Paint.Align.CENTER);第二种方式设置水平居中// 第二中方式计算,X 轴居中float width = paint.measureText(mText);ca

2021-01-17 22:21:39 230

原创 Android setContentView加载流程以及换肤应用

一、首先从Activity的启动讲起1、Activity的启动是通过ActivityThread的performLaunchActivity开始。2、然后创建Activity的上下文 ContextImpl appContext = createBaseContextForActivity()3、然后创建Activity( activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent))4、此时给Wind

2021-01-09 18:01:23 239 2

原创 Android getChildMeasureSpec的实例代码讲解

流式布局项目<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent

2021-01-06 22:49:20 212

原创 kotlin 语法基础入门

一、变量的定义fun main(){ // 可变变量定义 var 关键字 var name : String = "李国菁" // 不可变变量定义: val 关键字,只能赋值一次的变量(像Java中final修饰的变量) val age : Int = 10 // 下面这句就有问题,不能再次更改age的值 // age = 20; println(name) // 典型的类型推到出来,其实可以不用写 : String , 如果写上的话,颜色

2021-01-03 21:34:28 316

原创 Android 虚拟机与ClassLoader 类加载

一、JVM与Dalvik1、Android应用程序运行在Dalvik/ART虚拟机上,并且每个应用程序对应有一个单独的Dalvik虚拟机实例,Dalvik虚拟机也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。2、Dalvik虚拟机和Java虚拟机两者指令集是不一样的,前者基于寄存器的,后者是基于栈的3、基于虚拟机栈的如下图:执行过程如下图所示,都是在操作数栈进进出出,配合局部变量表来进行的。4、基于寄存区的虚拟机基于寄存器的虚拟机中没有操作数栈...

2020-12-27 12:02:42 216

原创 JVM 对象的创建和垃圾回收机制

一、虚拟机中对象的创建过程类的符号引用:用一组符号描述这个类的信息(com.lgj.Demo 类似这种)1、当Object o = new Object();首先在方法区中的常量池是否能够定位到这个类的符号引用2、指针碰撞:堆空间是非常规整的,有一个指针,指向最后一个对象分配的地址位置,然后当新new 一个对象的时候,这个指针移动一个对象大小的距离。如下图所示,红色代表已经占了的内存,白色代表还没占的内存。3、空闲列表:当堆内存经过垃圾回收之后,内存就有可能出现,下图所示,然后,专门有一张表来记

2020-12-25 22:41:12 245

原创 JVM 内存分析

一、JVM 与操作系统的关系1、JVM 把 .class 文件翻译成操作系统能识别的 2 进制数据进行执行。2、JVM跨平台性:假设我们写一个HelloWord.java程序,它即可以在Linux平台上运行,又可以在Windows平台运行,这个主要得益于 JDK的版本有Linux 和 Windows。3、JVM跨语言:Kotlin 可以运行在JVM上面,还有groovy 语言等都是运行在JVM上。二、运行时数据区1、运行时数据区:Java虚拟机在执行程序的过程中,会把它所管理的内存分为如干个不同

2020-12-22 22:27:37 365

原创 Rxjava使用以及源码分析

一、Rxjava 的核心思想1、发布订阅模式,发布者发布信息,订阅者如果订阅了该信息,那么就可以获取该信息2、举个例子: 下载图片 需要展示在ImageView上,下载图片相当于发布者,显示在ImageView上相当于订阅者,订阅者时刻观察发布者的动态,当下载图片完成后,立马显示在ImageView上3、一件事情,有起点(下载图片) 有终点(展示在ImageView上)在这中间可以穿插任何的卡片信息4、 比如在到达终点之前,可以给图片加上水印信息,这些都可以看做是穿插的卡片信息,上代码 priva

2020-12-05 17:25:53 141

原创 装饰者模式 && 门面设计模式 && 工厂方法模式

一、装饰者模式定义:在不改变原有对象的基础上,将功能附加到对象上public class DecoratorTest { public static void main(String[] args) { // 就拿一个拍照更能举例说明,他可以有美颜 和 滤镜功能,但是不能影响之前的拍照功能 // 设计模式遵循开闭原则 和 职责单一原则 //先拍照然后 美颜 最后滤镜 这三个功能互不牵扯 Component concreate = n

2020-12-05 10:57:47 161

原创 Java 多线程那点事

一、首先讲解 Volatile 关键字,上Demo,大家思考下,"子线程结束"这句话能不能打印呢?public class VolatileTest { public static void main(String[] args) { MyVolatileRunnable myVolatileRunnable = new MyVolatileRunnable(); new Thread(myVolatileRunnable).start(); try {

2020-11-28 10:50:54 91

原创 Java注解应用场景

注解有三种级别,注解的保留级别不同,对注解的使用场景自然不同,源码级别: 1.APT 在编译期能够获取注解与注解声明的类,包括类中的 所有成员信息,一般用于生成额外的辅助类.2.可以提供IDE语法检查,取代枚举的使用字节码: 1.在编译出Class后,通过修改Class数据以实现修改代码逻辑目的。2.对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解(这块还没用应用实例)运行期: 在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同

2020-11-21 09:17:40 549

原创 Java 泛型理解

请阅读下面代码,理解泛型真正的意义public class Demo1<H> { // 不能在静态域或者方法上引用泛型// public static H instance;// // 这两种写法都是错误的,不被允许,因为静态的变量和方法所以类,// public static H getInstance{// return instance;// } public static void main(String[] args)

2020-11-15 19:37:26 103

原创 Bridge模式

public static void main(String[] args) { /* * 用GG追MM来举例子 * 礼物分为:温柔型和狂野型 * WarmGift(温柔型的礼物) 和 WildGift(狂野型的礼物) * WarmFlower WildFlower * WarmBook WildBook * 如果再有别的抽象类。ColdGift(冷酷型的礼物) * 就会产生爆炸.

2020-10-01 11:08:18 140

原创 Builder模式

builder 模式分离复杂对象的构建和表示同样的构建过程可以创建不同的表示一个类构建的话,需要传递50个参数,这个时候就可以使用 Person person = new Person.PersonBuilder() .basicInfo(1, "liguojing", 29) .score(100) .weight(150) .location("袁旗寨",

2020-09-26 15:55:46 86

原创 进程间通讯回调客户端

首先进程间通讯的方式有:广播,ContentProvider(内容提供者),AIDL(Android接口定义语言)今天我们所讲的就是AIDL:首先定义AIDL接口文件,如果进程间要传递对象,那么这个对象必须实现Praceable接口:// Book.aidlpackage com.example.aidl;parcelable Book;远程服务端的方法,到书变化的时候通知给监听者package com.example.aidl;import com.example.aidl.Book

2020-09-20 15:57:51 352

原创 代理在Android中的应用,一行代码实现网络框架的切换

代理的定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。开闭原则:代码的功能是开放的,对于已经写好的代码要做到关闭下面介绍的这个案例是访问网络的代理实现HttpProxy类是访问网络的代理,具体的被代理对象是VolleyModel 和 OkHttpModel切换网络框架只要在MyAppcation中修改一行代码就ok,实现了编码的开闭原则 public void onCreate() { super.onCreate(); context = ge

2020-09-13 09:18:45 415

原创 策略模式

测试类public class MainTest { public static void main(String[] args) { Dog[] arr = {new Dog(50), new Dog(30), new Dog(40), new Dog(20)}; // 这个是排序工具类 SortLgj<Dog> dogSortLgj = new SortLgj<>(); // 这个是具体的排序策略

2020-09-12 11:23:32 76

原创 正确的单例模式

为什么要加Volatile关键字:防止指令重排序,原因是 new Singleton时,一般来说有三个步骤:1.分配一块内存2.在内存上初始化Singleton 对象3.把这块内存的地址返回赋值给 instance,但是经过编译器优化后2 和 3的顺序有可能颠倒,也就是说可能拿到的 instance 可能还没有初始化,访问instance时导致发生空指针异常,而 volatile 可以阻止这种事情的发生。public class ThreadPoolUtils { public stat

2020-09-12 09:24:37 138

原创 一种优雅的书写ListView的Adapter

主Activitypublic class MainActivity extends AppCompatActivity { private ListView listView; private ArrayList<FunctionBean> dataList; private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) {

2020-08-22 15:55:50 117

原创 APP性能分析

布局性能分析:减少布局的嵌套,可以通过Dump View Hierarchy for UI Automator来分析,可以看出每个布局的大小,以及摆放的位置双击 dual clock 让时间轴还原Real Time 方法调用一次实际执行时间,方法开始结束时间差(包括等待时间)Incl CPU Time 方法本身和其调用的所有子方法占用CPU时间一般的流程是查看,Real Time的时间,然后从大到小进行排序,然后找出耗时时间长的,进行分析,当然这里不需要对系统耗时时间过长进行分析...

2020-08-16 10:50:34 231

原创 AndroidStudio 打开DDMS

AndroidStudio 打开DDMS找到SDK目录,在tools下,直接双击monitor.bat,过上3秒左右就会自动打开,这个是我的SDK 路径:D:\AndroidStadio\sdk-as\tools如果打开报如下错误Could not open Selected VM debug port (8700)那么需要在这个目录下:C:\WINDOWS\system32\drivers\etc打开 host文件,添加如下映射::1 loca

2020-08-15 17:51:16 554

原创 使用对象池,减少内存碎片

对象池:import androidx.core.util.Pools;// 使用对象池public class User { public String username; public String password; //创建对象池,大小是10个,这个对象池是线程安全的 private static final Pools.SynchronizedPool<User> userPool = new Pools.SynchronizedPool<&

2020-08-15 15:30:45 177

原创 Java 多线程同步锁

需求是这样的,需要两个线程同时操作 一个对象的成员变量,让其按照 1 0 1 0 1 0 1 0 1 0 1 0 这样的格式进行输出public class MyObject { private int count; public synchronized void increase(){ if(count == 1){ try { wait(); } catch (InterruptedException e) { // TODO Auto-generated cat

2020-07-18 20:06:14 138

原创 lgj

package cn.itcast.zhxa11.widget;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import andr...

2020-04-28 22:28:51 409 1

原创 数据库事务的4个特性

1,第一原子性:原子性是指事务是一个不可分割的单元,要么都发生要么都不发生,比如转账,要么同时成功,要么同时失败2,一致性:如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变3,隔离性:多个事务并发访问时,事务之间是有隔离的事务的隔离级别有:Read Uncommited 脏读、读到了另一个事务没有提交的数据Read Commited 不可重复读,同一个事务,多次读取期间,另...

2020-03-15 21:13:05 198

原创 ScrollView 嵌套ListView 导致ListView条目显示不全问题记录

第一种解决方案,重新ListView的onMeasure 方法public NoScrollListview(Context context, AttributeSet attrs) { super(context, attrs); } /** * 避免ScrollView 嵌套 listview 显示不全问题 */ @Overrid...

2020-03-04 21:20:21 104

原创 View.inflate() 和 LayoutInflater.from(this).inflate() 的区别

llContainer = findViewById(R.id.llContainer);// 第一种情况下: View view = View.inflate(this, R.layout.activity_test, null);// inflate(resource, root, root != null); R.layout....

2019-12-30 19:29:51 474

原创 Android switch控件的使用

关闭下的状态打开下的状态 <Switch android:id="@+id/s_w" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" andro...

2019-12-22 15:54:16 279

空空如也

空空如也

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

TA关注的人

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