自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码小二的博客

勤学不辍

  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

原创 深入RecyclerView学习—缓存机制

前言RecyclerView作为替代ListView的组件,得益于RecyclerView的灵活性和可定制程度高的特性。除此之外RecyclerView的预取机制以及缓存机制也是RecyckerView的一大亮点。RecyclerView的灵活性是通过几个不同的组件协同实现的。LayoutManager:是布局管理器,用来决定视图如何填充RecyclerView。RecyclerView.Adapter:适配器是负责提供视图所需要的数据集以及管理视图的创建和数据绑定。ViewHolder:视图持有

2020-12-26 18:57:02 461

原创 Android视图体系—理解Window概念

前言在Android视图体系中Window就是一个窗口的概念。Android中所有的视图都是依赖于Window显示的,比如:Activity、Dialog、Toast都是在Window中显示的。首先来熟悉一下Window的属性。Window的类型: 应用Window:即Android应用所在的Window,比如Activity对应的Window; 子Windwo:必须依赖于应用Window存在,比如:Dialog; 系统Window:系统级别的Window,比如系统错误窗口、

2020-11-14 17:03:00 614 1

原创 Android架构组件—ViewModel原理学习

概述Android ViewModel是Android Jetpack组件库中的一个组件,在Android MVVM模式中被广泛使用。ViewModel的主要特性是以注重生命周期的方式存储和管理数据。这种特性体现在ViewModel与Android组件(Activity、Fragment和Service)的生命周期相绑定,在组件的生命周期中ViewModel的数据会一直保存在内存中,即便是在系统配置变更时也会存在。ViewModel的优势与UI层低耦合在MVVM模式中,数据和业务逻辑可以集中在Vi

2020-11-01 18:02:13 999

原创 枯燥的源码分析—Application创建过程

概述在Android应用进程中,每个应用都对应着一个Application。Application的创建于销毁贯穿了整个应用进程的生命周期。所以理解Application的创建过程不仅有利于我们理解应用进程的创建,还能加深对使用Application中的理解。接下来回从两个进程中来分析Application的创建过程,一个进程是system_server进程,一个是应用进程。这两个进程都在创建的过程中创建了Application。Application有什么用我们使用Application一般是在应

2020-10-31 17:52:27 382

原创 Service组件概览学习

前言作为Android四大组件之一的Service组件是一种可在后台长时间运行而不提供界面的应用组件。Service的一大特点就是可以在后台运行,即使用户切换到其他应用Service也可以继续工作。Service比较典型的应用场景是在后台播放音乐、处理网络事务、处理I/O等。接下来就来学习下Service组件基础的特性。Service的属性与启动方式在讲Service的生命周期前,先看下Service的三种类型以及Service的启动方式。在官方文档中,将Service分为3中类型,分别为:前台服务

2020-10-31 15:02:34 349

原创 Dart中的异步与事件循环

前言Dart作为Flutter的开发语言,了解Dart的机制是必可少的。本篇文章就介绍一下Dart的异步操作与事件循环机制。异步操作我们都知道在开发过程中,如果有耗时操作,我们一般都会使用异步任务解决,以防主线程卡顿。事件循环是Dart中处理事件的一种机制。Flutter中就是通过事件循环来驱动程序的运行,这点与Android中的Handler有点类似。Dart的事件循环机制Dart语言...

2019-09-09 19:16:56 1056

原创 Android高效开发(一)—合理使用图片资源

前言在Android开发中,我们难免会遇到加载图片的场景。不管是网络图片、资源图片或者是SD卡中的图片,都需要加载到内存中使用。如果不能合理处理图片,可能会导致OOM的问题或者其他性能问题,接下就讨论下Android中图片资源处理的几种常用的方式。Resource中的图片资源的处理在Android中开发的时候都会用到很多图片素材,对于某些背景图片、各种图标或者其他一些提示图片我们通常会放到r...

2019-08-20 22:36:34 307

原创 HTTPS工作原理

前言我们知道使用HTTP协议进行服务端与客户端通信时,信息是通过明文传输的。这期间信息就有可能被拦截或者篡改,为了解决这种场景,HTTPS就出现了。相对于HTTP来说,HTTPS有如下作用。 内容加密,无法被轻易破解; 身份认证,如果信息被篡改,通信双方可以立刻发现; 数据完整性校验;接下来就学一下HTTPS的工作原理。HTTPS的组成HTTPS是目前使用最多...

2019-08-19 09:53:36 3049

原创 重温四大组件(三)—Activity的启动过程

前言重温四大组件第四篇,这里分析一下Activity的启动过程。Activity的启动过程分为两种,一种是根Activity的启动,另外一种是普通Activity的启动过程。根Activity也就是默认启动的Activity(在AndroidMinifest.xml配置的启动Activity)。普通Activity指的是除根Activity的其他Activity。其中根Activity和普通Ac...

2019-08-10 19:40:08 170

原创 OKHttp学习(一)—OKHttp的工作原理

前言OKHttp是Square公司辨析的一个网络请求框架,也是目前市面上使用最多的网络框架之一。OKHttp是基于HTTP协议封装的一套请求客户端,在请求底层支持连接同一个地址的链接共享同一个Socket。OkHttp作为当前Android端最火热的网络请求框架之一,有很多的优点:支持HTTP/2 协议,允许连接到同一个主机地址的所有请求共享Socket。可以有效管理网络连接以及提高连接复...

2019-07-31 00:06:52 1407

原创 Glide学习(二)—缓存策略

前言在前面一篇文章中,主要分析了Glide的工作流程,以加载网络图片为例分析了Glide是如何工作的。在熟悉了Glide的工作流程后,我们就可以及继续一些细节的分析。接下来,针对Glide的缓存策略进行分析。我们知道,一个高效的图片框架是少不了缓存的,使用缓存可以减少资源的重复加载,提高资源的利用率。在Glide中,缓存分为两大类:内存缓存以及硬盘缓存。具体到缓存类型可以分为4种,一下是官网给...

2019-07-27 11:35:09 2609

原创 View中的Context是哪里来的

前言在自定义View中我们经常通过getContext()方法来使用Context获取资源、设置样式等。那么大家有没有想过View中getContext()获取的Context是来自哪里的?接下来就分析View中Context的生成过程。View的Context我们都知道在View中有个getContext()方法供开发者使用。 /** * Returns the conte...

2019-07-23 23:15:52 2015

原创 Kotlin学习(一)—Kotlin的泛型

前言在Kotlin中使用泛型的方式跟Java大体类似,其中也有一些特性的差别。不论是Java中的泛型还是Kotlin中的泛型,总有些概念会让人产生困惑。接下来回结合Java的泛型来学习Kotlin的泛型。Kotlin中泛型的使用在泛型的使用中,最常用到的就是泛型函数以及泛型类。在介绍这两种方式的使用之前,先介绍一下泛型的类型参数。泛型类型参数泛型的类型参数就是在声明泛型时定义的类型形参,...

2019-07-18 00:19:34 376

原创 Glide学习(一)—工作流程分析

前言目前在Android中有许多图片加载框架,比如UniversalImageLoader、Volley、Picasso、Fresco、Glide等。Glide作为一个快速高效的Android图片加载库,是Android开发使用最多的图片加载库之一。因为Glide的高性能、可扩展的特性,也是被Google推荐使用的图片加载库。用过Glide的同学都知道,Glide仅仅使用一行代码就可以将图片加...

2019-07-13 14:08:14 299

原创 Android上下文Context的那些小事

前言Context作为Android中的上下文对象,是Android常用的类。启动四大组件、创建视图、获取系统服务、访问资源等都要用到Context。从Context有上下文的意思,结合Context的职能。可以看出,Context在Android中提供了一个“语境”的意义,它提供了应用程序环境的全局信息。在这个“语境”中可以通过Context使用相应的接口,做符合当前“语境”意义的事。比如,...

2019-05-31 22:53:55 340

原创 Android自定义Lint增量代码检查工具

背景Lint是Google提供的一个静态代码检查工具,可以扫描出代码中潜在的问题,并且会对开发人员做出提示。而且除了Android原生提供的几百种Lint规则以外,还可以使用Lint框架的API自定义Lint规则。自定义Lint规则可以根据项目需求制定不同的扫描规则。比如:编码规范、代码风格、特定问题检查等。有了自定义检查规则,提交代码的时候可以规范代码编写。但是还有一个问题,新的代码使用新...

2019-05-22 22:25:47 951 1

原创 重温Android四大组件(二)—Activity的启动模式与标志位

前言重温Android四大组件的第二篇,主要总结Activity的启动模式以及相关的标志位。Activity启动模式是Activity的一个重要的属性,启动模式决定了Activity在Activity栈的存在的行为。不同的启动模式下的Activity有不同的表现,所以开发者需要搞清楚各个启动模式的特性以及相互之间的区别。Activity的启动模式standard(标准模式):这是系统默认的...

2019-05-08 09:44:12 294

原创 重温Android四大组件(一)—Activity的生命周期

前言四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了。但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心。这里以《重温Android四大组件》为题目是为了巩固自己的Android基础,加深对Android的认知。Activity生命周期探索Activity生命周期是Activity在不同场景下表现的一种状态,...

2019-04-20 17:01:25 284

原创 Android探索之路(四)—View的使用

前言在这篇文章之前已经总结学习了View的工作流程、事件分发机制。这里总结一下在工作过程中使用View的一些感想,主要从常用的View中的一些方法以及View的一些基础知识两方面来进行介绍。View的位置参数在Android系统中存在着坐标系用来确定位置。分为两种:一种是Android坐标系(是整个Android设备的坐标系),还有一种是View的坐标系(是一个视图的坐标系)。这两种坐标系都...

2019-02-11 23:06:41 919

原创 Android系统架构(二)—Android系统启动过程

前言作为一个Android应用层的开发,平常对于Android系统底层并不十分了解

2019-01-17 22:27:18 629

原创 Android系统架构(一)—Android系统架构简述

前言Android系统是一种基于Linux的操作系统。通常将Android系统分为5层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。![Android系统架构](https://img-blog.csdnimg.cn/20181231211730947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGV...

2018-12-31 22:06:05 2520

原创 Android探索之路(三)—View的事件分发机制

前言View作为Android应用与用户交互入口,除了展示视图外,还承担了处理用户操作的任务,比如用户的点击、长按、滑动事件等。处理点击事件的机制就是View的事件分发机制。View的事件分发机制当用户点击屏幕时,就会产生点击事件,这个事件信息被封装在一个类中,这个类就是MotionEvent。事件产生后Android系统会将事件传递到View的层级中,然后MotionEvent就会在Vie...

2018-12-24 22:10:58 185

原创 Android探索之路(二)—View的工作流程

Android中View体系概览在Android应用中所有的用户界面元素都是由View和ViewGroup对象构建而成。View对象用于绘制屏幕中可以和用户交互的内容。ViewGroup用于存储其他View对象和ViewGroup对象,从而构成界面的布局。就如图中所示,用户界面的布局就是通过View和ViewGroup的结构层次定义的。View和ViewGroup组成了用户界面的View树,在...

2018-12-18 22:06:54 282

原创 Java并发编程(五)—线程池ThreadPoolExecutor详解

前言在Java并发场景下,Java线程池是最经常运用的并发框架,而且在诸如Tomcat、数据库等工具中也都用到了Java线程池。合理地使用线程池可以给编程带来很多好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统...

2018-10-31 23:04:47 416

原创 Java并发编程(四)—基于队列同步器的可重入锁

前言在Java 1.5版本的时候,Java提供了新的同步机制—Lock接口,通过Lock接口可以实现不同类型的锁来支持多线程的同步。相比较synchronized关键字,通过Lock实现的锁可以更好的控制同步块的粒度。在Lock子类的内部实现中,锁是通过Java的队列同步器实现的(AbstractQueuedSynchronizer),不熟悉队列同步器的同学,可以参考我的另一篇博客[Java并...

2018-10-29 22:05:06 202

转载 HTTP/2简介

该文章转载至Google Web Developers. 原文地址:HTTP/2简介HTTP/2 可以让我们的应用更快、更简单、更稳定 - 这几词凑到一块是很罕见的!HTTP/2 将很多以前我们在应用中针对 HTTP/1.1 想出来的“歪招儿”一笔勾销,把解决那些问题的方案内置在了传输层中。不仅如此,它还为我们进一步优化应用和提升性能提供了全新的机会!HTTP/2 的目的是通过支持完整的...

2018-09-15 14:45:23 4770

原创 Android-FindBugs中常见的bug级别与问题说明

16公版Lint检查汇总项目名称:Project20160503 SVN版本号:119312 检查工具:Lint、FindBugs基于FindBugs的分析Bug级别Scariest(最高bug级别)ScaryTroublingOf ConcernScariestBug数量:共29条Useless self-operation(描述:自我赋值,将值自己赋...

2018-09-10 22:36:33 7961 1

原创 Java并发编程(三)—队列同步器(AbstractQueuedSynchronizer)

前言在Java多线程环境中原子操作是保证线程同步的基本。在Java中通常使用所和循环CAS的方式实现原子操作。 使用循环CAS实现原子操作:在Java虚拟机中实现CAS操作是通过CMPXCHG指令实现的,而CAS循环就是循环的进行CAS操作直到成功为止。 使用锁机制实现原子操作:在Java中为并发编程的同步实现了很多锁机制,包括偏向锁、轻量级锁和互斥锁等。而锁机制保证了只有获取锁的线程才能...

2018-08-09 23:31:34 407

原创 Java并发编程(二)—线程的本质

前言Java是一种多线程语言,从一开始就支持了多线程开发,在我们的应用程序中也难免会用到线程去解决一些问题。使用多线程会不会是程序变快呢?如今大多数计算机都是多核处理器,将程序分布到不同的处理器去处理自然会加快程序的运算速度,使程序更快的响应。但是在单处理器中多个线程运行时,还会产生上下文切换的开销,这个时候程序会更快的运行吗?答案是在单处理器情况下程序也会更快的运行,因为线程有一种状态叫做阻...

2018-07-17 23:18:02 1709

原创 Android探索之路(一)——消息处理机制

摘要在Android应用程序中,主线程启动时就会在内部创建一个消息队列。然后进入一个无限循环中,轮询是否有新的消息需要处理。如果有新消息就处理新消息。如果没有消息,就进入阻塞状态,直到有新消息到达。 那么在Android系统中,消息处理机制是怎么实现的呢?在程序开发时,我经常会使用Handler处理消息。所以可以直到Handler是个消息处理者。那么还有消息队列和消息轮询两个角色。它们分别是...

2018-07-14 17:49:17 2509

原创 Java并发编程(一) —Java内存模型

物理机中的并发。 处理器——>高速缓存——>内存 缓存一致性Java内存模型 Java线程——>线程工作内存——>主内存 内存一致性 内存间的交互操作 主内存到工作内存 工作内存到主内存 操作对象:变量volatile 1.保证此变量对所有线程的可见性 2.禁止指令重排序Java内存模型需要

2018-06-17 18:09:55 381

原创 Python基础概览

前言Python自从出现以来,使用者越来越多,而且非常简单易用。 同样的功能,使用Java可能需要1000行代码,但是使用Python可能只需要200行就够了。因为Python作为一门高级语言,有丰富的代码库和高级的数据结构可以使用,对于一些功能不需要重复的开发。而且Python以缩进的风格组织代码,去除了大量的{}表示。最后Python不需要声明很多变量。 Python可以用来做什么: ...

2018-06-07 23:11:35 282

原创 Java容器(二)-CurrentHashMap详解(JDK1.8)

摘要在涉及到Java多线程同步时,如果我们使用HashMap可能会导致死锁问题吗,但是使用HashTable效率又不高。所以这个时候ConcurrentHashmap是我们最好的选择。 为什么使用ConcurrentHashMap:在多线程环境中使用HashMap的put方法有可能导致程序死循环,因为多线程可能会导致HashMap形成环形链表,即链表的一个节点的next节点永不为nul...

2018-05-27 20:59:39 40754 5

原创 Java容器(一)-HashMap详解(JDK1.8)

摘要HashMap可以说是在程序开发中使用最频繁的映射处理的数据类型。在JDK1.8中又对HashMap进行了优化,引入了红黑树的数据结构和扩容的优化。接下来就探讨一下HashMap的结构和实现原理。简介Java中的映射类容器都是继承自java.util.Map接口,Map接口主要有四个实现类,它们分别是:HashMap、LinkedHashMap、TreeMap和Hashtable。...

2018-04-05 15:47:02 1050

原创 Java虚拟机学习(四)-类的加载机制

摘要在Java虚拟机中,经过编译的Java文件都通过Class文件格式存储。当执行Java程序时,需要将Class文件加载到Java虚拟机内存中。从虚拟机把类的Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被Java虚拟机使用的Java类型,这就是虚拟机的类加载机制。类加载简述注意:以下的类都默认表示为类或接口,在Java虚拟机中类或接口有着相似的加载过程。...

2018-03-31 17:51:31 190

原创 Java虚拟机学习(三)-类文件结构的简单介绍

我们都知道计算机在执行程序时,只能识别0和1格式的程序,但在Java虚拟机出现之后,便有了一种新的程序存储格式——字节码。也正因为实现了从机器码到字节码的转变,使得Java程序可以”Write Once, Run Anywhere”(一次编写,到处运行)。时至今日,出现了一大批基于虚拟机运行的语言,比如:Scala、Groovy等。 今天的学习结果就是记录一下Java程序在编译成字节码后的文件结

2018-01-27 16:12:30 253

原创 Java虚拟机学习(二)-内存管理

我们都知道Java有一个鲜明的特点,就是内存的动态分配和自动回收,这使得开发者不必自己管理内存的分配与回收,可以将主要精力放在程序开发中。同时,内存管理机制也使得Java变得容易上手。 我们虽然在开发的过程中不用关心内存的回收,但是也难免会遇到内存溢出、内存泄漏这些问题。所以学习Java的内存管理有利于我们及时的发现问题。接下来就是我学习Java内存管理机制的一些笔记。

2017-12-30 17:09:18 314

原创 Java虚拟机学习(一)-运行时数据区

作为一个Java程序员,如果要深入学习Java的话,那么了解Java虚拟机是必不可少的。通过学习Java虚拟机的知识,我们不仅可以了解Java的运行原理,而且也可以加深对Java编程的理解。

2017-12-06 23:05:47 285

原创 git解决non-fast-forward冲突

在使用git的过程中,我们总会遇到提交冲突问题。在今天更新git提交时,由于之前没有更新分支,同时又提交了分支中的代码,而git不能在不丢失提交的情况下对远程库进行修改,这就导致了再次提交代码是无法push成功的情况。

2017-11-20 18:37:49 56497 1

原创 微信公众号支付开发流程与避坑手册-Java篇

最近完成了微信公众号内的未支付功能,当然开发的过程中难免遇到各种各样的问题,在这里把我开发的过程分享出来,给大家做个参考。 首先,在准备开发的时候需要进行必要的配置。1.登录微信商户平台,在产品中心->开发配置中对支付授权目录进行配置 (注意:支付授权目录的配置规则是你使用微信支付控件页面的上一级目录,比如:你在www.xxx.cpm/wx/pay/pay.html中调用微信支付控件,那么你需要

2017-10-03 15:21:53 4655 2

vue-popupwindow

使用vue.js实现的popupwindow组件

2017-07-29

空空如也

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

TA关注的人

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