自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 macOS安装Homebrew

macOS安装Homebrew请参考https://brew.sh/index_zh-cn.html

2021-02-02 15:33:00 107

转载 git一台电脑管理多个Git账户和SSH KEY

这里我们先讲下单个git账号的配置,然后再将多个git账号的配置,前提是你已经安装了git。git安装在Linux上安装Git首先,你可以试着输入git,看看系统有没有安装Git:$ gitThe program 'git' is currently not installed. You can install it by typing:sudo apt-get install git像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。如果你碰巧用Debi

2021-02-02 13:51:49 640

原创 Android获取View宽高的常见方式

背景有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,然后进行相应的操作,但是我们在onCreate()、onStart()、onResume()中获取View的大小,获取到的值都是0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的v

2021-02-01 18:09:30 13486

原创 Android native工程引入flutter

Android的native工程以source源码的方式和aar方式引入flutter过程步骤请参阅将 Flutter module 集成到 Android 项目代码请看Demo传送门需要注意的是,以aar方式集成的时候,repositories的maven需要添加到app的build.gradle的android闭包内部,否则无法成功。...

2021-01-27 21:40:32 162

原创 Flutter国际化

国际化Flutter App实用的 Flutter 国际化指南快速适配 Flutter 之语言国际化

2021-01-21 13:42:15 139 1

原创 Android应用内多语言切换

关于Android多语言支持的介绍,请参阅谷歌Android开发者文档,这里就不再介绍了,下面直接进入正题。实现方案1)在项目的资源文件夹里添加不同语言的value 文件夹strings.xml资源这个可以借助Android Studio来完成(res->New->Android Resources File->Locale)2)设置Configuration 中的 locale 属性Configuration 包含了设备的所有的配置信息,这些配置信息会影响应用获取的资源。例如

2021-01-17 20:10:44 1700

转载 Android卸载系统应用

adb无需root卸载系统应用我们都知道一般预置的 APP 是不能卸载的,需要有 root 权限,今天分享一个命令,帮你卸载那些你想卸载又不能卸载的系统预置的 APP。adb shell pm uninstall [-k] [--user USER_ID] 包名参数说明:-k 卸载应用且保留数据与缓存,如果不加 -k 则全部删除。–user 指定用户 id,Android 系统支持多个用户,默认用户只有一个,id=0。可以用这个命令,user 和 debug 版本都可以用,所有应用都

2021-01-15 15:36:29 2803

原创 AspectJ学习

Android AOP面向切面编程详解深入理解Android之AOP

2021-01-02 18:51:10 120

原创 ARGB透明度换算

ARGB 依次代表透明度(alpha)、红色(red)、绿色(green)、蓝色(blue)。以颜色值 #FF99CC00 为例,其中,FF 是透明度,99 是红色值, CC 是绿色值, 00 是蓝色值。透明度透明度分为256阶(0-255),计算机上用16进制表示为(00-ff)。透明就是0阶,不透明就是255阶,如果50%透明就是127阶(256的一半当然是128,但因为是从0开始,所以实际上是127)。透明度 和 不透明度 是两个概念, 它们加起来是1,或者100%.ARGB 中的透明度al

2020-12-18 18:23:09 2457 1

转载 Android滚动工具Scroller解析

Scroller是一个专门用于处理滚动效果的工具类,很多大家所熟知的控件在内部都是使用Scroller来实现的,如ViewPager、ListView等。如果能够把Scroller的用法熟练掌握的话,我们自己也可以轻松实现出类似于ViewPager这样的功能。先不说Scroller,其实任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,如下图所示:这两个方法都是用于对View进行滚动的,scrollBy()方法是让View相对于当前的位置滚动某段

2020-12-02 20:34:23 506

原创 ArrayList什么情况会抛出ConcurrentModificationException

背景近日,在看ArrayList的源码实现,发现很多情况会抛出ConcurrentModificationException。下面总结一下大致发生的情况。 首先,ArrayList不是线程安全的。 首先来看一个例子:public static void main(String[] args){ List<Integer> aList = new ArrayList<Integer>(); aList.add(1); aList.

2020-12-01 20:45:58 629

原创 Android滑动事件冲突

如果对Android的触摸事件分发不了解的同学,请先了解完事件分发再看此文章比较容易理解。滑动冲突常见场景1.外层与内层滑动方向不一致,外层ViewGroup是可以横向滑动的,内层View是可以竖向滑动的(类似ViewPager,每个页面里面是ListView)2.外层与内层滑动方向一致,外层ViewGroup是可以竖向滑动的,内层View同样也是竖向滑动的(类似ScrollView包裹ListView)情况1和2的嵌套如下图就是这三种情况示意图滑动冲突解决方案外部拦截法:父View根

2020-11-07 16:07:23 653

原创 Android轮播图

youth5201314/bannerAndroid 手写一个轮播图(banner)框架Android App Banner,用它就够了。无限轮播、简单易用、扩展性强的BannerViewandroid banner安利一款轮播控件ViewPager2:打造Banner控件

2020-11-06 10:58:05 164

原创 Android Bitmap 全面详解

每一个 Android App 中都会使用到 Bitmap,它也是程序中内存消耗的大户,当 Bitmap 使用内存超过可用空间,则会报 OOM。 因此如何正确使用也是 Android 工程师的重点关注内容。Bitmap 占用内存分析Bitmap 用来描述一张图片的长、宽、颜色等信息。通常情况下,我们可以使用 BitmapFactory 来将某一路径下的图片解析为 Bitmap 对象。当一张图片加载到内存后,具体需要占用多大内存呢?getAllocationByteCount 探索我们可以通过 Bi

2020-11-04 18:33:45 7182

原创 Android中Window、Activity和View的关系

Activity 的 setContentView显然 Activity 几乎什么都没做,将操作直接交给了一个 Window 来处理。getWindow 返回的是 Activity 中的全局变量 mWindow,它是 Window 窗口类型。那么它是什么时候赋值的呢?startActivity 的过程,最终代码会调用到 ActivityThread 中的 performLaunchActivity 方法,通过反射创建 Activity 对象,并执行其 attach 方法。Window 就是在这个方法中

2020-11-03 16:47:49 1075

原创 Java 内存模型与线程

Java 内存模型一词翻译自 Java Memory Model,简称 JMM,它所描述的是多线程并发、CPU 缓存等方面的内容什么是Java内存模型上图描述的意思是,在每一个线程中,都会有一块内部的工作内存(working memory)。这块工作内存保存了主内存共享数据的拷贝副本。虚拟机栈和线程的工作内存并不是一个概念。在 Java 线程中并不存在所谓的工作内存(working memory),它只是对 CPU 寄存器和高速缓存的抽象描述。CPU 普及作为一个程序员,尤其是 Java 程序员,

2020-11-02 13:45:15 174

原创 Android touch 事件分发

Android touch 事件的分发是 Android 工程师必备技能之一。关于事件分发主要有几个方向可以展开深入分析:touch 事件是如何从驱动层传递给 Framework 层的 InputManagerService;WMS 是如何通过 ViewRootImpl 将事件传递到目标窗口;touch 事件到达 DecorView 后,是如何一步步传递到内部的子 View 中的。其中与上层软件开发息息相关的就是第 3 条,也是本文的重点。Touch事件我们知道一次完整的Touch事件序列为

2020-10-13 02:08:23 573

原创 Synchronized与 ReentrantLock

synchronizedsynchronized 可以用来修饰以下 3 个层面:修饰实例方法;修饰静态类方法;修饰代码块。synchronized 修饰实例方法这种情况下的锁对象是当前实例对象,因此只有同一个实例对象调用此方法才会产生互斥效果,不同实例对象之间不会有互斥效果。比如如下代码:上述代码,在不同的线程中调用的是不同对象的 printLog 方法,因此彼此之间不会有排斥。运行效果如下:可以看出,两个线程是交互执行的。如果将代码进行如下修改,两个线程调用同一个对象的 print

2020-10-08 22:46:18 765

原创 GC 回收机制与分代回收策略

Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,这几个区域内不需要过多考虑回收的问题。而堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的就是这部分内存。什么是垃圾所谓垃圾就是内存中已经没有用的对象。 既然是”垃圾回收"

2020-10-06 20:47:37 324

原创 Java程序运行时,内存到底是如何进行分配的?

Java 的内存区域划分:Java 虚拟机在执行 Java 程序的过程中,会把它所管理的内存划分为不同的数据区域。下面这张图描述了一个 HelloWorld.java 文件被 JVM 加载到内存中的过程:HelloWorld.java 文件首先需要经过编译器编译,生成 HelloWorld.class 字节码文件。Java 程序中访问HelloWorld这个类时,需要通过 ClassLoader(类加载器)将HelloWorld.class 加载到JVM 的内存中。JVM 中的内存可以

2020-10-05 20:18:21 1587

原创 工厂模式

工厂方法模式抽象接口/** * 发型接口 */public interface HairInterface { /** * 实现了发型 */ public void draw();}接口实现类1public class LeftHair implements HairInterface{ @Override public void draw() { System.out.println("LeftHair");

2020-10-03 19:57:11 116

转载 详解原型模式的clone方法

Java中对象的创建clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造

2020-10-03 18:56:06 700

原创 Java线程池详解

背景Java 中线程的创建以及上下文切换是比消耗性能的,因此引入了偏向锁、轻量级锁等优化技术,目的就是减少用户态和核心态之间的切换频率。但是在这些优化基础之上,创建和销毁线程非常损耗性能,那有没有可能复用一些已经被创建好的线程呢?答案是肯定的,那就是线程池。另外,线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,在线程销毁时需要回收这些系统资源,频繁地创建销毁线程会浪费大量资源,而通过复用已有线程可以更好地管理和协调线程的工作。线程池主要解决两个问题:当执行大量异步任务时线程

2020-10-02 23:58:08 213

原创 MVP 中 presenter 生命周期的管理

我们经常在 Android MVP 架构中的 Presenter 层做一些耗时操作,比如请求网络数据等。然后根据请求后的结果刷新 View。但是如果按返回结束 Activity,而 Presenter 依然在执行耗时操作,那么就有可能造成内存泄漏,严重时甚至会造成程序崩溃,因为 Presenter 中的 View 已经变为 null。为了解决这个问题,我们需要将 Activity 的某些生命周期方法与 Presenter 保持一致。Lifecycle 绑定 Presenter 生命周期LifeCycle

2020-09-29 01:47:04 1833

原创 快速掌握Android Handler

Handler 现在几乎是 Android 面试的必问知识点了,主要场景是子线程完成耗时操作的过程中,通过 Handler 向主线程发送消息 Message,用来刷新 UI 界面。分析源码的时候最好是找到一个合适的切入点,Handler 源码的一个切入点就是它的默认构造器。从 new Handler() 开始在无参构造器里调用了重载的构造方法并分别传入 null 和 false。并且在构造方法中给两个全局变量赋值:mLooper 和 mQueue。这两者都是通过 Looper 来获取,具体代码如下:

2020-09-27 02:22:44 161

原创 Android动态权限适配

在 Android 6.0 也就是 API 版本 23 之前,App 需要的权限都会在安装阶段向用户展示。而在 App 运行期间则不需要动态判断权限是否已申请。从 6.0 之后的版本开始,App 需要在代码中动态申请相应的权限。权限分类Android 权限分 2 种:普通权限和危险权限,这 2 种权限都需要在 AndroidManifest 清单文件中声明。普通权限(Normal Permission)在程序运行时期自动获取,只需要在清单文件中声明即可。最常用的就是 INTERNET 网络权限。

2020-09-23 00:51:04 810

原创 Android网络请求优化

DNS 解析优化安全方面首先是防劫持,我们可以考虑使用 HttpDns。这里需要注意 HttpDns 只是一个概念,并不是一个现有的开源库。它与传统的 DNS 解析的区别在于 HttpDns 会绕过运营商的 DNS 服务器,直接与 DNS 服务器的 80 端口进行交互,有效地防止了域名劫持。目前业内主要由第三方厂商提供实现了 HttpDns 的 SDK,比较普及的是阿里云和腾讯云的 HttpDns Service。但是这两者的使用具有一定的成本:开发者需要在它们的平台注册并获取开发者 key,并且部分

2020-09-22 00:25:16 1746

原创 解决okhttp报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed

解决okhttp 报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed,原因为OkHttp请求回调中response.body().string()只能有效调用一次,我们可以把它保存起来 传递给下一个调用方在调用了response.body().string()方法之后,response中的流会被关闭,我们需要创建出一个新的response给应用层处理。代码如下: @Overridepubl

2020-09-21 01:53:08 2770

原创 Android Https的详解

Https的通信过程两种加密加密方式分两种,对称加密和非对称加密。这两种方式都有自己的优劣势, https中这两种方式都采用了。 我们约定S是服务端,C是客户端,客户端需要从服务端获取信息;对称加密这种加密方式比较简单,就是双方都持有密匙。S和C都持有密匙, S通过密匙加密明文传递给C,C获取加密后的信息,用密匙解密信息。优势: 加密速度快劣势: 密匙的传递是个问题,容易被截取,密匙一旦被截取后, 就能轻易破解信息。常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5

2020-09-20 16:45:04 4376

原创 解决“error: the requested upstream branch ‘origin/master‘ does not exist”

问题:1、本地初始化了git仓库,放了一些文件进去并进行了add操作和commit提交操作;2、github创建了git仓库并建立了README,.gitignore等文件;3、本地仓库添加了github上的git仓库作为远程仓库,起名origin; git remote add origin 远程仓库地址4、本地仓库也远程仓库关联git branch --set-upstream-to=origin/master master这个时候就出现了解决问题如果直接pull,就会出现一下

2020-08-16 14:12:49 20368 7

原创 Javassit学习

动态字节码生成技术Javassist使用方法总结Javassist 使用指南(一)Javassist 使用指南

2020-07-26 19:53:09 167

原创 Android Transform

Transform详解深入了解TransformApi如何理解 Transform APIGradle 学习之 Android 插件的 Transform APIAndroid Gradle Transform 详解

2020-07-20 23:59:41 1739

原创 Dart学习

高效 Dart 语言指南Dart 编程语言中文网Dart语言——45分钟快速入门Dart语言速览Dart语言教程

2020-07-10 23:56:30 140

原创 Android Q适配

Android Q适配

2020-06-20 16:10:16 146

原创 动态权限shouldShowRequestPermissionRationale详解

Android6.0动态权限shouldShowRequestPermissionRationale的含义

2020-06-20 15:28:45 1441

原创 Android实现应用的多启动图标

方式一如果需要实现多个启动图标只需要在目标activity或者任一带有ui界面的组件设置intent-filter节点的catgegory属性值为LAUNCHER即可<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wings.multi_launcher"> <ap

2020-06-17 17:38:35 963

原创 Gradle插件的所有使用方式

Gradle插件 https://mp.weixin.qq.com/s/KCpl0CNgwMv0CgvbadNK6AGradle学习 http://www.imooc.com/wiki/gradlebase/intro.html

2020-06-12 23:29:41 3543

原创 Android使用Gradle插件实现SPI

基于 Android Gradle Plugin Transform API 的 Android SPI 实现方案基于 Android Gradle Plugin Transform API 的 Android SPI 实现方案android-spi

2020-05-24 20:45:45 323

原创 RxBus

RxBus在rxjava2.0 的基本使用[深入RxBus]:异常处理[深入RxBus]:支持Sticky事件RxBus2.x的全面详解这个 RxBus 稳如老狗

2020-05-05 22:46:23 172

原创 Fragment的FragmentTransaction 的commit()和commitAllowingStateLoss()以及commitNow()和commitNowAllowingState

Android 基础:Fragment 各种 Commit 使用注意事项和异常解析Fragment进阶-commit使用细节及源码分析Fragment的FragmentTransaction 的commit()和commitAllowingStateLoss()以及commitNow()和commitNowAllowingStateLoss()commit(), commitNow()和co...

2020-04-24 22:04:42 2152

空空如也

空空如也

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

TA关注的人

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