自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 优雅地处理运行时权限请求

前言从android 6.0(API 级别 23)开始,android引入了运行时权限,用户开始在应用运行时向其授予权限,而不是在应用安装时向其授予权限,如果应用的某项功能需要使用到受运行时权限保护的资源(例如相机、位置、麦克风等),但在运行该功能前没有动态地申请相应的权限,那么在调用该功能时就会抛出SecurityException异常, android 6.0已经推出了很多年了,相信大家对于运行时权限的申请过程已经非常的熟悉,但是android的运行时权限的申请过程一直都是非常的繁琐的,主要有两步:

2021-10-01 02:53:01 616

原创 快速发布组件到mavencentral

前言在很久之前写过一篇发布开源库到jcenter的文章,但不幸的是几个月前Jfrog发布了终止Bintray服务的声明,声明的大概意思是说2021年3月31号之后Jcenter仓库将不再接收用户的组件提交,同时将Jcenter设为只读代码仓库,无限期地提供现有组件供用户下载,也就是说目前Jcenter仓库的状态是你无法再提交组件的更新,但你可以继续下载你以前托管的组件版本,所以现在你要做的就是把你的组件的新版本发布到其他仓库,例如Jitpack和MavenCentral,我曾经写过一篇快速发布开源库到ji

2021-09-15 20:54:30 298

原创 解决AndroidStudio的Flutter插件无法显示已连接的设备,一直是loading状态的问题

title: 解决AndroidStudio的Flutter插件无法显示已连接的设备,一直是loading状态的问题tags:categories:前言按照官方教程在电脑上配置好Flutter开发环境,在AndroidStudio上安装好Flutter插件,新建一个Flutter项目后,发现toolbar中展示已连接设备的那个方块一直是loading状态,如下:但是我明明通过数据线把手机和电脑连接上了,在命令行中执行flutter devcies,输出如下:$ flutter devices.

2020-07-02 18:16:54 2789 2

原创 在VMware上安装Ubuntu

前言想要学习一下Linux的相关知识和编译一下android源码,但奈何电脑是Window系统,把Window系统装成Linux系统又麻烦,已经习惯Window系统,又没有钱重新买一台电脑直接换成Linux系统。所以使用虚拟机安装一个Linux系统是一个比较好的方案,常用的虚拟机有VirtualBox和VMware,本文教你如何在VMware上安装Linux系统,如果想用VirtualBox安装...

2020-05-30 23:36:24 290

原创 java学习总结之I/O操作

前言I/O(Input/Output)操作,即输入输出操作,它是一个相对的过程,我们一般站在位于内存中的程序的角度来思考这个操作的过程,输入就是程序需要数据,把数据从数据源中流入程序,输出就是程序需要保存或传输数据,把数据从程序中流出到数据源,这个数据源一般为文件、网络、压缩包等,所以数据源和程序就通过数据流通道组成了一个半双工的输入/输出模式,如下:java从更高层次把输入和输出抽象出来,封装成一些对程序员友好的API,我们只需要操作这些I/O接口就能简单的实现I/O操作,了解了输入输出模式的大体结

2020-05-30 23:34:30 417

原创 java学习总结之反射

前言在java中,反射就是在程序运行时动态的获取某一个类的元数据(metadata,描述数据的数据)的过程,这些元数据包括构造器、方法、成员变量、内部类、接口、父类等,通过反射,我们可以在程序运行时动态地去操作类的方法、成员变量等信息,所以,在java中,反射为我们提供了一种动态访问、修改类的能力,掌握反射,对我们加深java语言的理解很有帮助,反射大部分所使用到的类都在java.lang.re...

2020-03-19 22:27:18 898

原创 RecyclerView之缓存设计

前言上一篇文章RecyclerView之布局设计RecyclerView,见名之义,这个View代表了可循环使用的视图集合控件,封装了View的缓存逻辑判断,RecyclerView的基本单元是ViewHolder,里面有一个itemView代表了视图上的子View,所以RecyclerView的缓存基本单元也是ViewHolder。本文将从源码的角度来讲解RecyclerView的缓存设...

2020-01-15 17:29:51 1026 1

原创 使用贝塞尔曲线实现一个loading控件

前言上一篇文章:仿微信滑动按钮本文是自定义View实践第二篇,上一篇实现了一个简单的滑动按钮,知道了一些自定义View的基本步骤,本文是使用贝塞尔曲线实现的一个加载中控件,接下来进入正文讲解。地址:WaveLoadingView效果图可以看到,WaveLoadingView除了用于loading外,还可以用于显示进度的场景。实现方式在效果图中,波浪是曲线的形式的,所以我们需要想办法...

2020-01-01 14:38:53 1912

原创 Android消息机制解析(java层)

前言Android的消息机制用于同进程的线程间通信,它是由MessageQueue,Message,Looper,Handler共同组成,Android中大量的交互都是通过消息机制,比如四大组件启动过程与服务的交互、View的绘制、更新等都离不开消息机制,所以Android在某种意义上也可以说成是一个以消息驱动的系统,在Android中消息机制的运作分为java层和native层,它们之间的运作...

2019-12-11 23:05:13 801

原创 ThreadLocal原理解析

概述ThreadLocal,线程本地存储区(Thread Local Storage,简称为TLS),通过它可以在指定的线程中存储数据,数据存储之后,只能在指定的线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据。使用ThreadLocal 提供了 get(),set(T value),remove() 3个对外方法,来看一个简单的例子:public class Main {...

2019-12-08 18:33:33 774

原创 java学习总结之线程池

前言上一篇文章:java学习总结之线程当我们需要频繁的创建多个线程时,每次都通过new一个Thread是一种不好的操作,创建一个线程是要消耗资源,频繁的创建会导致性能较差,而且我们还要管理多个线程的状态,管理不好还可能会出现死锁,浪费资源。这时就需要java提供的线程池,它能够有效的管理、调度线程,避免过多资源的消耗,通过线程池的统一调度、管理,使得多线程开发变得更简单。本文讲解一下有关线...

2019-11-30 19:38:45 392

原创 你知道有多少种方式实现单例模式?

前言单例模式是应用最广的模式之一,也是最简单的模式,但越是简单的东西,就越容易忽略它的细节,在应用这个模式时,同一个进程内,单例对象的类必须保证只有一个实例存在,比如在一个应用中,应该只有一个ImagerLoader实例,因为这个ImagerLoader中含有线程池、缓存系统、网路请求等,创建一次需要消耗很多资源,因此,没有理由让它构造多个实例,这种不能自由的构造对象,确保某一个类有且只有一个对...

2019-11-29 21:09:09 2129

原创 java学习总结之线程

前言在java中,线程非常重要,我们要分清楚进程和线程的区别:进程是指一个内存中运行的应用程序,每个进程都拥有自己的一块独立的内存空间,进程之间的资源不共享;而线程是CPU调度的最小单元,一个进程可以有多个线程,线程之间的堆空间是共享的,但栈空间是独立的,java程序的进程至少包含主线程和后台线程(垃圾回收线程)。了解这些知识后,来看下文有关线程的知识。一、并发和并行我们先来看一下概念:...

2019-11-25 18:14:23 1034

原创 java学习总结之集合框架

前言在JDK1.2之前,java是没有完整的集合框架的,只有一些简单的可以扩展的容器类,如Vector、Stack、Hashtable等,这些容器类它们解决了数组不能动态扩容和使用复杂的问题,到了JDK1.2之后,为了管理这些容器类,就出现了集合框架这个概念,集合框架是为了表示和操作集合而规定的一种统一的标准的体系结构,它包含三大内容:对外的接口、接口的实现和对集合运算的算法(对某一种数据结构的...

2019-11-21 20:18:17 556 1

原创 java7和8的源码下载

java7和8的源码

2019-11-17 13:29:24 249

原创 行为型模式之备忘录模式

备忘录模式介绍见名知义,备忘录模式是用来保存对象的当前状态,并且在之后可以再次恢复到此状态,备忘录模式实现的方式需要保证对象的状态不能被对象从外部访问,目的是为了更好的保存这些对象的完整性以及实现内部不向外暴露。备忘录模式的定义在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。备忘录模式的使用场景(1)需要保存一个对象在...

2019-10-23 22:44:34 150

原创 仿微信的滑动按钮

前言前几天写过一篇文章View的工作原理,有原理不行,还要有实践,刚好把以前项目写过的仿微信滑动按钮控件封装一下,所以本文记录一下我实现这个控件的细节。效果图控件使用效果如下:![](https://img-blog.csdnimg.cn/20190907195948577.gif)除了颜色,看起来和微信的还是挺像的。准备1、选择自定义View的方式自定义View有3种途径实现:1...

2019-09-07 20:01:48 397

原创 基于P2P的局域网即时通信应用

前言这是一个使用java语言开发的基于P2P的局域网即时通信Android应用,界面是高仿微信的聊天界面,在里面你将会学到java多线程并发编程、Socket编程、UDP广播、TCP连接等。项目地址:P2P设计思路P2P不同于C/S方式,它没有集中式的服务器,在P2P中,程序既是服务器又是客户端,在同一个局域网内,每个用户发送的消息不会经过路由器转发到其他局域网,那么如何保证大家都在同一个...

2019-07-14 11:21:55 3730 8

原创 快速发布开源库到jitpack

前言最近几天准备发布一个开源库,方便自己使用,一开始了解到的是发布到jcenter仓库中,它是目前世界上最大的java和Android开源软件构件仓库,而且 JCenter 是 Android Studio 默认使用的服务器仓库,只需要一句话就可以搞定整个包的导入过程,但是它的发布过程繁琐,而且对于新手来说特别不友好,就算你跟着网上教程来发布,运气好的话你就会发布成功,如果运气不好,你就会遇到很...

2019-06-10 22:47:05 749

原创 android6.0动态权限申请的正确流程

前言从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。所以如果你的应用使用到了一些危险权限,就必须在AndroidManifest.xml 中静态地声明需要用到的权限,并在使用到该功能时要动态的申请,否则在调用到相应权限功能时候,会抛出 SecurityException异常。所以本文探讨一下动态权限的申请的正确流程,并把它封装成一个...

2019-06-06 17:47:05 1105

原创 使用bintray-release发布开源库到jcenter

前言前几天写过一篇文章快速发布开源库到jitpack,在里面我控诉发布jcenter的发布过程繁琐,对新手不友好,直到这几天我遇到了一个bintray-release插件,发现它可以帮助你更简单的发布开源库到jcenter上,而且过程也很简单。如果你还不懂jcenter是什么或者你不懂那些配置有什么作用,强烈建议你先看一下这个两篇文章教你一步步发布一个开源库到 JCenter、手把手教你发布自...

2019-06-05 21:32:59 595

原创 搞定两种场景下的Fragment懒加载

前言我对懒加载的定义是:数据的加载要等到页面对用户可见时才加载,否则的话会浪费用户流量。网上实现懒加载的方案非常多,但大多数都是解决了我下面说到的场景一的懒加载,本文还解决场景二的懒加载方式。如果不想看下面的分析,直接这个类导入你的项目中,需要懒加载的Fragment继承这个类,并重写相应的方法就行:传送门。场景一: Viewpager + Tablayout + Fragment什么?不...

2019-05-19 21:02:36 462

原创 解决AndroidStudio的Unknown host“一堆乱码”和“Can't get XX”或 “Can’t resolve XX”问题

前言自从AndroidStudio升级到3.4后,每次打开以前的项目就出现一堆问题,把那个红色报错的复制粘贴去网上搜,都没有解决,后面还是靠我自己的摸索弄了几个小时才解决掉,所以记录一些,避免再次遇到。Unkown Host"杩欐槸鍦ㄤ富鏈哄悕瑙f瀽鏃堕 氬父鍑虹幇鐨勬殏鏃", You may need to adjust the proxy settings in Gradle首先我是遇到...

2019-05-11 22:23:31 3068

原创 在VMware上配置Linux虚拟机

前言上一篇文章在VMware上安装Ubuntu前面在VMware上安装了Linux虚拟机,因为是虚拟机,所以需要配置一下才能更好的使用,如在电脑里复制一段命令,在Linux虚拟机里的命令行粘贴打开就行,在虚拟机里编辑文件,在电脑中可以直接打开,无需复制粘贴,替换掉软件源为国内源,这样访问网络更快。安装VMware ToolsVMware tools可以更方便的管理虚拟机,比如共享剪贴板...

2019-05-08 20:48:47 255

原创 创建型设计模式之抽象工厂模式

介绍在前面已经讲解过工厂方法模式,这俩者有什么区别呢?前面所说的工厂方法模式只会生产一种具体的产品,而抽象工厂模式生产出来的产品是不确定的。例如不同操作系统中控件的实现不一样,展示效果也不一样,对于操作系统如Android,iOS,WindowPhone本身构成一个产品类,而其控件如Button,TextView也构成产品类,两种产品类两种变化,各有各的特性。定义为创建一组相关或者相互...

2019-04-20 14:52:24 242

原创 创建型设计模式之原型模式

原型模式的介绍原型二字代表该模式应该有一个样板实例,用户从这个样板中复制出一个内部属性一致的对象,这个过程也就是我们俗称的“克隆”。被复制的实例就是我们所称的“原型”。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可以使程序运行更高效。原型模式定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象原型模式使用场景(1)类初始化需要消...

2019-04-20 14:49:25 155

原创 如何获取Android应用与系统信息

前言本主要了解一下Android系统信息的获取,apk应用信息的获取。本文相关源码在文末给出Android系统信息的获取有时我们想要获取手机系统的配置信息,通常可以从以下俩方面获取:android.os.BuildSystemProperty1、android.os.Buildandroid.os.Build包含了系统编译时的大量设备,配置信息,它里面的字段含义如下...

2019-04-13 18:07:31 739

原创 SVG入门学习

前言SVG对于android开发者听起来是陌生的东西,因为它是属于前端的产物,其实Android中也是支持SVG的,语法也很简单易懂,本文就通过我自己学习的经历,和大家一起学习一下SVG。什么是SVG?Google 在Android5.X中增加了对SVG矢量图形的支持,可以用来创建高效率的动画, 所以我们先来了解一下SVG的定义:可伸缩矢量图形(Scalable Vector Grap...

2019-04-12 22:48:14 328

原创 结构型设计模式之装饰者模式

介绍装饰者模式又称为包装模式,平时开发中,我们想要扩展一个现有对象,一般的做法是继承这个对象,然后在子类中添加功能,而装饰者模式就是继承的一种替代方案,也是一种动态扩展对象功能的方法。定义动态的给一个对象添加一些额外的职责。使用场景需要动态且透明地扩展类的功能时,类图角色介绍:Component: 抽象组件,可以是接口或抽象类,其实是被装饰的原始对象。ConcreteComp...

2019-04-12 18:31:37 135

原创 java学习总结之基础

前言万事开头难,准备从零把java相关知识点捡起来,把自己所学的Java知识点归纳,下面是关于java的一些基本知识点。java代码的运行过程创建java源程序,扩展名为.java使用javac命令编译源程序为字节码文件,扩展名为.class使用java命令运行字节码文件,在不同平台执行数据类型下面用一张表概括:数据类型类型说明符位数字节整形int...

2019-04-11 20:49:07 293

原创 java学习总结之面向对象

前言上一篇文章java基础本篇文章继续Java知识点的归纳,梳理一下关于面向对象的知识点,涉及到封装、继承、多态,还有接口,类之间的关系。接口和抽象类1、抽象类抽象类和抽象方法都用abstract关键字进行声明,抽象类不能被实例化,不能直接创建,抽象方法必须放在抽象类中。public abstract class Hero{ public abstract void fig...

2019-04-11 19:14:39 198

原创 从进程的角度看Android的系统架构

上一篇文章Android的系统架构概述

2019-03-28 22:08:12 296

原创 Window, WindowManager和WindowManagerService之间的关系

前言上面3个名词在开发中经常听到,在Android开发中,Window是所有视图的载体,如Activity,Dialog和Toast的视图,我们想要对Window进行添加和删除就要通过WindowManager来操作,而WindowManager就是通过Binder与WindowManagerService进行跨进程通信,把具体的实现工作交给WindowManagerService(下面简称WM...

2019-03-26 20:56:38 2077

原创 RecyclerView之观察者模式

前言RecyclerView是Android开发中的一个重要的模式,通常我们往RecyclerView添加数据时,都会调用Adapter的notifiyXX函数,这是为什么呢,今天我们就从源码来探究一下,对观察者模式不熟悉的读者,可以看一下这一篇博客观察者模式, RecyclerView在更新数据时也算是对观察者模式的一种应用。本文源码基于Android8.0, 相关源码位置如下fram...

2019-03-09 19:18:02 440

原创 RecyclerView之布局设计

前言RecyclerView功能强大,自推出以来受到了无数人的喜爱,它可以通过一个LayoutManager将一个RecyclerView显示为不同的样式,例如ListView、GridView样式、瀑布流样式,所以加深对于RecyclerView的学习对于开发有很重要的意义。关于RecyclerView如何使用网上有很多文章,本篇文章从源码讲解RecyclerView如何通过layoutMan...

2019-03-01 15:22:36 967

原创 适配器模式

适配器模式的介绍适配器模式在开发中使用频率很高,那么何为适配器呢?适配器就是将两个不兼容的类融合到一起,或者说将两种不同的东西通过转换使得它们可以相互协作起来。比如生活中的手机充电器,家用电压220V,手机充电只需用到5v,那么手机充电器就是把220v装换为手机合适使用的电压来进行充电,手机充电器就是一个电源适配器。适配器模式的定义适配器模式把一个类的接口变成客户端所期待的另一种接口,从而使...

2019-02-24 16:28:43 178

原创 结构型设计模式之代理模式

代理模式的介绍代理模式,也称委托模式,何为代理呢? 在日常生活中就比如叫朋友替你拿个快递,叫朋友替你做一下作业,叫朋友替你买点东西等等,这个朋友就是你的代理,你把事情委托你的朋友做了,是不是很通熟易懂。同样在代码的世界中也存在代理,而且在你以后阅读到更多的设计模式时,你会发现很多的设计模式中也有代理模式的影子。代理模式的定义为其他对象提供一种代理以控制这个对象的访问。代理模式的使用场景当...

2019-02-23 18:40:01 277

原创 Android消息机制解析(native层)

前言

2019-02-21 13:17:15 1921 4

原创 观察者模式

介绍观察者模式是一个使用率非常高的模式,这个模式的一个重要作用就是将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。定义观察者模式定义对象间一种一对多的依赖关系,使得当每一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新。使用场景(1)关联行为场景,需要注意的是,关联行为是可拆分的,而不是组合关系(2)事件多级出发场景(3)跨系统的消息...

2018-10-11 19:48:12 1609

原创 行为型设计模式之责任链模式

介绍责任链模式是一种链式结构,就是由一个个节点首尾相接串起来的结构,具有很好的灵活性,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依此传递每一个节点对象,直到有对象处理这个请求为止,我们将这样一种模式称为责任链模式。定义使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该...

2018-10-08 14:59:40 279

空空如也

空空如也

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

TA关注的人

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