- 博客(57)
- 收藏
- 关注
原创 Activity setContentView 源码解析
Activity#setContentViewpublic class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCall
2021-03-22 23:56:59 254
原创 Android AOP 之 AspectJ 统一处理网络检测
利用 AOP 之 Eclipse AspectJ//采用 AspectJX 来快速配置 Eclipse AspectJ//project gradledependencies { classpath "com.android.tools.build:gradle:4.1.2" //add classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'}plugins {
2021-03-19 20:43:23 299
原创 Android 处理 View 重复点击的 4 种方式
1、抽象类//实现 View.OnClickListener 接口public abstract class OnThrottleClickListener implements View.OnClickListener { private static final String TAG = "OnThrottleClickListener"; private static final int SKIP_DURATION = 300;//milliseconds private
2021-03-18 14:43:23 556
原创 Windows cmd 命令之 cd
文中讨论的知识基于 Windows cmd 命令提示符在 cmd /e:on 命令扩展启用的情况下(默认是开启的 ,可以通过 cmd /e:off 关闭)CHDIR 可以简写成 CD,全名 Change Directory ,有切换功能和显示功能切换功能cd . 切换到当前目录C:\Users\louisgeek>cd .C:\Users\louisgeek>cd .. 切换到上一级目录(父目录)C:\Users\louisgeek>cd ..C:\Users>
2021-03-16 20:26:01 827
原创 Java Singleton 单例模式
属于创建型模式1 饿汉式//1.1 静态常量public class Singleton { //未使用就提前实例化了 private final static Singleton INSTANCE = new Singleton(); // 私有构造方法,防止被外部直接实例化 private Singleton(){} public static Singleton getInstance(){ return INSTANCE; }}//1.2 静态全局变量p.
2021-03-11 18:57:51 448
原创 Java System.arraycopy 和 Arrays.copyOf 的区别
System.arraycopy只有数组为一维数组且元素为基本类型、String 类型的时候是深拷贝,其它情况下都属于浅拷贝,比如元素是引用类型、二维数组的情况调用的是 native 方法,性能好需要传入 dest可以指定起始位置和拷贝的长度,比较灵活 /** * Copies an array from the specified source array, beginning at the * specified position, to the specifi
2021-03-11 11:10:53 177
原创 Java 创建线程的 3 种方式
通过继承 Thread 类//匿名 Thread 类new Thread(){ //重写 run 方法 @Override public void run() { super.run(); }}.start();class MyThread extends Thread { @Override public void run() { super.run(); }}//假设把 run 方法看成一个任务,那么.
2021-03-05 20:58:16 172 2
原创 Android Activity 生命周期
1 完整生命周期6个onCreate —— onStart—— onResume——onPause——onStop——onDestory1所有Activity生命周期方法的实现都必须先调用其父类版本。2由于Activity经常会暂停和恢复之间切换,所以onResume和onPause这两个方法应当是轻量级的。3在系统再某种紧急情况下需要回收内存,onStop、onDestory可能不会被调用,因此需要在onPause中把需要长期保存的数据保存起来。2 经典场景场景1:第
2021-02-16 17:31:34 241
原创 国家商用密码算法
国家商用密码算法已公开国密算法: SM2/SM3/SM4/SM9/ZUCSM-商密,用于商用的、不涉及国家秘密的密码技术对称加密(私有密钥加密)分组密码SM4原名 SMS4,用于数据加密,替代 AES/DES序列密码ZUC祖冲之序列密码算法非对称加密(公开密钥加密)椭圆曲线SM2包含数字签名、密钥交换和公钥加密,替代 RSA/ECDSA/ECDH标识密码SM9基于身份的密码算法,替代 PKI/CA 体系数字签名(公钥数字签名)密码哈希算法 密码散列函数S
2022-05-09 23:44:34 2710
原创 java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案
java.lang.IllegalStateException Can not perform this action after onSaveInstanceState 解决方案Fragment闪退复现Handler().postDelayed({ //打开页面后在 5 秒内按 home 或 back val fragment = Fragment() supportFragmentManager.beginTransaction() .replace(R.id
2022-02-06 20:35:04 3974
原创 Java String StringBuilder StringBuffer 之间的区别
String 字符串常量String 类被 final 修饰String 类中维护的 char[] 数组也是 final 修饰的String 类是无法被继承和改变的,是不可变对象,每次对 String 对象进行改变,如字符串拼接、截取等操作都会生成一个新的 String 对象后将指针指向新的 String 对象,所以效率比较低,性能最差,对于要经常改变内容的字符串不推荐使用 String 类StringBuilder 字符串变量(非线程安全)继承自 AbstractStringBuilder
2021-08-03 16:25:03 145
原创 Java HashMap 原理
HashMap线程不安全的public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { }构造函数 /** * The next size value at which to resize (capacity * load factor). * * @serial
2021-07-29 22:20:49 152
原创 Square OkHttp3 源码解析
https://github.com/square/okhttphttps://square.github.io/okhttp源码基于 3.12.0okhttp3.OkHttpClient#OkHttpClient()public OkHttpClient() { //无参构造就相当于创建了一个空 Builder 对象 this(new Builder());}OkHttpClient(Builder builder) { this.dispatcher = .
2021-07-21 17:59:33 193
原创 Java 泛型
用 List 举例List,List<?>,ListList原生类型、原始类型List<?>通配符类型List参数化类型,实参是 Object List list = new ArrayList(); List<?> arrayList = new ArrayList(); List<Object> objList = new ArrayList(); List<String&
2021-04-29 20:46:51 85
原创 Android RecyclerView
RecyclerView 常规使用DataItem.javapublic class DataItem { public String id; public String title; public String subtitle; public String content; public int imageResId;}可选实现 Cloneable 接口,可解决后面遇到对象引用问题listitem_image_text.xml<?xml
2021-04-26 20:48:36 124
原创 Java 实现 ConcurrentHashSet
Java 中没有直接提供 ConcurrentHashSet 这样的类,可以通过 java.util.concurrent.ConcurrentHashMap 类来间接实现Apache Dubbo//https://github.com/apache/dubbo/blob/master/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ConcurrentHashSet.java/* * Licensed to the Apache
2021-04-22 17:04:51 540
原创 GitBook 知识总结
GitBook 简介https://www.gitbook.com一个可以创建、书写、阅读电子书的网站支持将 md 等格式文件导入形成电子书提供 Gitbook CLI(Command Line Interface)工具,基于 Node.jsGitbook CLI基于 Node.js安装 node.jshttps://nodejs.org/en/download由于在使用 gitbook 时候出现如下报错gitbook init Error: TypeErr
2021-04-08 21:05:38 391
原创 Android 解析 XML 的 3 种方式
HTMLHyper Text Markup Language 超文本标记语言XMLExtensible Markup Language 可扩展标记语言为啥不叫 EML?难道 Ex 读着像 X ?DOMDocument Object Model 文档对象模型解析速度慢,内存占用大一次性读取 XML,把 XML 解析成一个树形结构放入内存中Document 代表整个 XML 文档Element 代表一个 XML 元素Attribute 代表一个元素的某个属性SAXS.
2021-04-07 16:51:54 142
原创 Android 后台 Service 和子线程的区别
运行在后台的“后台 Service”和运行在后台的“子线程”有什么区别?后台 Service四大组件之一,自身不提供 UI 元素默认是运行在主线程的,耗时操作需要开子线程,可以选用 IntentService可以不依赖 Activity 存在与否,能做到程序关闭后仍旧能继续执行,能够长时间运行"后台"的概念主要是它不和 UI 打交道,是运行在后台的服务,最多通知前台 UI 更新子线程对应主线程的说法"后台"的概念主要是能够异步运行...
2021-04-07 16:50:00 448
原创 Android LayoutInflater 源码解析
1 View.inflate(Context context, @LayoutRes int resource, ViewGroup root)public static View inflate(Context context, @LayoutRes int resource, ViewGroup root) { LayoutInflater factory = LayoutInflater.from(context); return factory.inflate(re
2021-03-31 17:51:27 274
原创 Java 引用类型
Reference Type 引用类型三种:数组、类、接口定义时变量引用指向存具体数据的内存地址,变量存在栈内存中,值存储在堆内存中用 equals() 比较array 数组、class 类、interface 接口数组类接口String 字符串枚举注解Lambda...
2021-03-29 19:57:01 85
原创 Java 关键字之 synchronized
synchronized 知识线程安全问题单线程不会存在线程不安全问题,而多个线程可能会存在同时访问同一个资源(变量、对象、文件、数据库,这种资源又叫临界资源、共享资源)的情况,会导致程序运行结果不是预期结果解决线程安全问题的方案同步互斥访问在同一时刻,确保只能有一个线程访问该临界资源,当一个线程在访问临界资源的代码上加一个锁,当用完临界资源后释放锁,从而让其他线程能够继续访问该资源,java 可以通过 synchronized 和 Lock 关键字实现同步互斥访问类锁方法锁...
2021-03-26 22:15:05 66
原创 Java Annotation 注解
Java的4种类型,Class、Interface、Enum、Annotation都属于Class类型注解简介也有人把它叫做注释、元数据,是一种代码级的说明注解很像一个接口,多了一个 @ 符号,采用 @interface 作为关键字用于生成文档配合编译器分析检查代码,提升代码逻辑严谨性代码功能的增强修改程序的行为元注解用于定义注解@Target声明注解的目标,就是可以在什么地方使用ElementType/** Class, interface (includin
2021-03-25 23:19:19 124
原创 Kotlin Singleton 单例模式
1 饿汉式object Singleton { fun doSome1() { println("test") }}Kotlin 调用方式 Singleton.doSome1()Java 调用方式 Singleton.INSTANCE.doSome1()Android Studio 通过 Tools -> Kotlin -> Show Kotlin Bytecode 查看编译后的字节码,点 Decompile 转成反编译后的 Java 代码//f
2021-03-12 23:23:58 805
原创 Java ArrayList 源码解析
ArrayList//继承了 AbstractList<E> //实现了 List<E> //实现了 RandomAccess 接口,支持随机访问//实现了 Cloneable 接口,代表可复制的//java.io.Serializable 可被序列化public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable,
2021-03-10 20:03:07 59
原创 EventBus 源码解析
EventBus.getDefault()//volatilestatic volatile EventBus defaultInstance;……//就是通过 双重校验并加锁的单例模式 获取到 EventBus 的实例public static EventBus getDefault() { EventBus instance = defaultInstance; if (instance == null) { synchronized (
2021-03-09 19:52:04 67
原创 Android 消息机制
Handler 是什么Handler 怎么用Handler handler= new Handler()覆写 handleMessagehandler.sendMessageActivityThread 的 main() 方法调用了//其实就是 UI线程默认为应用创建 Looper 对象Looper.prepareMainLooper();……//最后调用了Looper.loop();先看 Looper 的 prepareMainLooper 方法-> prepare(fal
2021-03-07 23:27:22 171
原创 Android HandlerThread
HandlerThread继承 Thread组合了 一个 Handler 和 Looper流程实例化HandlerThread handlerThread = new HandlerThread("name");启动子线程handlerThread.start() 创建 Handler,传入 handlerThread 的 Looper 进行关联//无参方法已过时Handler workHandler = new Handler(handlerThread.get
2021-03-06 19:49:13 120
原创 Android 自定义 View
三类组合现有控件把现有控件组合起来形成一个新的控件继承现有控件在该控件的基础之上添加新功能直接继承 View / ViewGroup流程measure、layout、drawmeasure 测量确认 View 的宽高先测量子view的大小,最后测量自身的大小onMeasure,measureChild,measureChildren,setMeasureDimesiononMeasure(int widthMeasureSpec, int heightMeasure
2021-03-03 21:03:25 181 1
原创 Android Activity 启动模式
launchModel 启动模式standard 标准模式默认模式。每次启动一个Activity都会重新创建一个新的实例singleTop 栈顶复用模式新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,如果新的Activity已经存在但不是位于栈,onNewIntent方法被回调顶,那么新的Activity仍然会重新重建singleTask 栈内复用模式singleInstance 单实例模式启动模式的意义假设一个 Activity 频繁启动
2021-02-28 21:32:32 147
原创 Java 基础 线程创建的 3 种方式
1 继承 Thread 类,重写 run 方法无法实现资源共享,是一种特殊的 Runnable ( Thread 也是实现 Runnable 的) MyThread myThread = new MyThread(); myThread.start();2 实现 Runnable 接口,实现 run 方法可实现资源共享 MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable);
2021-02-26 09:32:38 107
原创 Java 总结 常用线程池和自定义线程池
1 通过 Executors 工厂类来创建线程池| 创建线程池的方法 | newFixedThreadPool | 有固定线程数的线程池,如果没有任务执行,那么线程会一直等待 || newCachedThreadPool | 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除 ||newWorkStealingPool | 创建一个拥有多个任务队列(以便减少连接数)的线程池 || ne
2021-02-23 21:39:22 157
原创 Java 基础 Java 简介
java 是 sun 微系统公司发布的支持跨平台运行的 java 平台和 java 语言的总称java 语言以前叫 Oak95年5月23日正式发布版本命名以前叫 j2se j2ee j2me04年9月30日发布 java 1.5 直接命名 java 5.005年6月 java se6 发布,开始改为 javase javaee javame06年11月13日开始开源09年4月20日甲骨文收购了sun公司11年7月28日 java7 发布14年 java8 发布...
2021-02-23 09:31:00 116
原创 Java 基础 Java 的特性
简单的继承了 C 和 C++ 的优点,去掉了难点,复杂点:多继承,操作符重载,自动强制类型转换,加入了引用代替指针,自动垃圾回收内存管理面向对象的
2021-02-21 17:14:30 123 1
原创 Java 和 Kotlin 权限访问修饰符的区别
修饰符JavaKotlinpublic所有类可见所有类可见(默认)private当前类可见当前类可见protected当前类、子类、同一包路径下的类可见当前类、子类可见default同一包路径下的类可见(默认)无internal无同一模块中的类可见...
2021-02-17 22:01:06 325
原创 Kotlin Parcelable @Parcelize 知识总结
Kotlin 1.4.20 及以后//独立插件apply plugin: 'kotlin-parcelize'Kotlin 1.3.60 及以后//扩展插件 包括 @Parcelize 和 kotlinx.android.synthetic(替代findViewById)apply plugin: 'kotlin-android-extensions'//如果只想启用扩展插件里的 parcelize 功能androidExtensions { features = ["p.
2021-02-16 17:43:02 2237
原创 Android 总结 ViewPager 中 Fragment 滑动切换、数据保存
/** * FragmentPagerAdapter和FragmentStatePagerAdapter最大的区别就是instantiateItem和 destroyItem实现不一样,如果都重写了2者的效果就基本一样了 * 重写instantiateItem ,destroyItem 滑动切换 Fragment数据保存状态 */public class MyFragmentPagerAdapter extends FragmentPagerAdapter {//public class MyF
2021-02-16 17:38:02 333
原创 Android 总结 ViewPager 使用
1 ViewPager + PagerAdapterPagerAdapter/** * Created by louisgeek on 2016/3/23. */public class MyPagerAdapter extends PagerAdapter { private List<View> views; public MyPagerAdapter(List<View> views) { this.views = views;
2021-02-16 17:36:12 159
原创 Android 总结 Activity 和 Fragment 交互
Activity 调用 Fragment1 直接调用//findFragmentById 或者 findFragmentByTagif (getSupportFragmentManager().findFragmentById(R.id.a_fragment) instanceof AFragment ){AFragment aFragment = (AFragment ) getSupportFragmentManager().findFragmentById(R.id.a_fragmen
2021-02-16 17:35:03 236
原创 Android 总结 Fragment 生命周期
1 完整生命周期11个onAttach——onCreate——onCreateView——onActivityCreated——onStart——onResume——onPause——onStop——onDestroyView——onDestroy——onDetach2 经典场景场景1:第一次启动AA:【onAttach——onCreate —— onCreateView—— onActivityCreated——onStart——onResume】场景2:在A上启动BA:【onP
2021-02-16 17:33:32 211
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人