Java随机数之ThreadLocalRandom学习
[TOC]
事情的全部起因来自于这样一个程序
1234567891011121314151617181920212223242526272829303132public class VolatileTest { public static volatile int race = 0; public static void increase(){ race++; } private static final int THREADS_COUNT = 10; public static void main(String[] args) { Thread[] threads = new Thread[THREADS_COUNT]; for (int i = 0;i < THREADS_COUNT;i++){ threads[i] = new Thread(new Runnable() { @Override ...
Java随机数之ThreadLocalRandom学习
[TOC]
文章参考:https://www.jianshu.com/p/128476015902
概述CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的门栓,似乎有一点“三二一,芝麻开门”的感觉。CountDownLatch的作用也是如此,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。
总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。
CountDownLatch主要有两个方法:countDown()和await()。countDown()方法用于使计数器减一,其一般是执行任务的线程调用,await()方法则使调用该方法的线程处于等待状态,其一般是主线程调用。
CountDownLatch的使用这里需要注意的是,countDown()方法并没有规定一个线程只能调用一次,当同一个线程调用多 ...
Memory Analyzer(MAT)分析内存泄漏
文章参考:https://www.javatang.com/archives/2017/11/08/11582145.html
文章参考:http://vivianking6855.github.io/2018/05/04/Android-optimization-AS-MAT/
文章参考:https://blog.csdn.net/Jin_Kwok/article/details/80326088
概述MAT是Eclipse出品的一个插件,当然也有独立的版本。下载链接:https://www.eclipse.org/mat/downloads.php
MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要根据自己的实际代码和业务逻辑去分析这些数据,判断到底是不是真的发生了内存泄漏。
MAT支持对标准格式的hprof文件进行内存分析,所以,我们要先在Android Studio里先把Java heap文件转成标准格式的hprof文件,具体步骤如下:
1、点击左侧的capture,选择对应的文件,并右键选择“Export to standard .hpr ...
Android性能优化之堆内存监控脚本
概述文章参考:
脚本参考脚本名称:pressure_test_dump_heap.sh
123456789101112131415#!/bin/bashwhile true; do fileName=$(date +%Y%m%d%H%M) packageName='com.ainirobot.moduleapp:sandbox' echo $fileName dumpsys meminfo packageName >$packageName-$fileName.log # dumpsys meminfo >total_$fileName.log sleep 60done# 启动脚本的执行# sh pressure_test_dump_heap.sh & # 停止脚本的执行#ps -ef | grep pressure_test_restart.sh |kill -9
启用脚本12# 启动脚本的执行sh pressure_test_dump_heap.sh &
停止脚本12# 停止脚本的执行ps -ef | grep ...
Android性能优化之Android Profiler工具使用
概述
文章转自:https://developer.android.com/studio/profile/android-profiler?hl=zh-cn
文章转自:https://blog.csdn.net/Double2hao/article/details/78784758
文章转自:https://wetest.qq.com/lab/view/359.html
文章转自:https://blog.csdn.net/u010410408/article/details/52386621
文章参考:https://www.jianshu.com/p/bdfd2a6b2681
Android Profiler分为三大模块: cpu、内存 、网络。下面,我们一次来讲解一下这个工具的使用。
内存分析器Memory ProfilerMemory Profiler 是 Android Profiler 中的一个组件,可帮助您识别导致应用卡顿、冻结甚至崩溃的内存泄漏和流失。 它显示一个应用内存使用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。
要打开 Memory P ...
Android之性能优化性能监控框架
[TOC]
文章参考:https://github.com/Kyson/AndroidGodEye/blob/master/README_zh.md
概述
Glide图片加载框架基础学习
[TOC]
文章转自:http://blog.csdn.net/guolin_blog/article/details/53759439
概述Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。
要想使用Glide,首先需要将这个库引入到我们的项目当中。新建一个GlideTest项目,然后在app/build.gradle文件当中添加如下依赖:
123456789repositories { mavenCentral() google()}dependencies { implementation 'com.github.bumptech.glide:glide:4.9.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'}
Glide图片加载框架源码学习
[TOC]
文章参考:https://blog.51cto.com/u_15254659/4867295
概述Android图片加载框架,在android应用开发中是一个常见的话题。在12、13年的时候我记得可能用的最多的是XUtils的一套框架(更早之前叫aFinal框架),这个框架中提供imageUtils用于在android应用的开发中完成远程图片的加载。再后来呢,有Picasso、Fresco、Glide。而这几年的开发经验来看,Glide最为流行。不信,可以查看github上项目地址,分别对比对比watch数、fork数、star数,就能确定Glide确实最为流行。
Android之View绘制深度解析之工作原理探究
[TOC]
文章参考:https://www.jianshu.com/p/3d2c49315d68
概述在Android的知识体系中,View扮演着很重要的角色,简单来理解,View是Android在视觉上的呈现。在界面上Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统提供的控件,因为这样就意味这应用界面的同类化比较严重。
但是,通过自定义View我们可以实现各种五花八门的效果。但是自定义View是有一定难度的,尤其是复杂的自定义View,大部分时候我们仅仅了解基本控件的使用方法是无法做出复杂的自定义控件的。为了更好地自定义View,还需要掌握View的底层工作原理,比如View的测量流程、布局流程以及绘制流程,掌握这几个基本流程后,我们就对View的底层更加了解,这样我们就可以做出一个比较完善的自定义View。
我们从上面的这段话中,可以看到View的绘制流程总共分三个阶段:测量流程(measure)、布局流程(layout)、绘制流程(draw)。
View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过mea ...
Android之View绘制深度解析之Measure流程
[TOC]
文章参考:https://blog.csdn.net/briblue/article/details/72190143
文章参考:https://www.jianshu.com/p/1dab927b2f36
概述View的工作流程主要是指measure()、layout()、draw()这三大流程,即测量、布局和绘制,其中measure确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制到屏幕上。
下面我们来学习measure()方法。为了更好地理解View的测量过程。
我们还需要理解下面两个类:
ViewGroup.LayoutParams类
MeasureSpecs 类(父视图对子视图的测量要求)
理解 ViewGroup.LayoutParamsViewGroup 的子类(RelativeLayout、LinearLayout)有其对应的 ViewGroup.LayoutParams 子类
如:RelativeLayout的 ViewGroup.LayoutParams子类= Re ...