zhq217217
码龄9年
关注
提问 私信
  • 博客:220,317
    220,317
    总访问量
  • 84
    原创
  • 1,327,437
    排名
  • 38
    粉丝
  • 0
    铁粉

个人简介:只要不停地走,再慢也会超越所有人。。。

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
  • 加入CSDN时间: 2016-01-18
博客简介:

zhq217217的博客

查看详细资料
个人成就
  • 获得42次点赞
  • 内容获得28次评论
  • 获得66次收藏
创作历程
  • 22篇
    2022年
  • 1篇
    2020年
  • 1篇
    2019年
  • 14篇
    2018年
  • 20篇
    2017年
  • 66篇
    2016年
成就勋章
TA的专栏
  • 图解知识点
    2篇
  • 工具类
    3篇
  • 工作记录
    42篇
  • Android测试知识
    1篇
  • Android源码分析
    18篇
  • Android控件学习
    10篇
  • 面试题解析记录
    4篇
  • php学习
    1篇
兴趣领域 设置
  • 移动开发
    flutterandroid studio
  • 软件工程
    性能优化
  • 学习和成长
    面试
创作活动更多

超级创作者激励计划

万元现金补贴,高额收益分成,专属VIP内容创作者流量扶持,等你加入!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

图解知识点:leakcanary

leakcanary缺点:就是无法应用于线上1.由于把 heap 内存 dump 到 APP 对应的文件系统中的一个 .hprof 文件中是一个非常耗时的过程,使app长时间无响应2.leakcanary会频繁的触发gc操作,gc过程会STW,容易造成卡顿3.生成的.hprof文件特别大,无法及时发送给服务器分析解决方案:1.不频繁的触发gc,只在activity和fragment的生命周期中增减监听2.给app设置一个内存阀值,当内存到达阀值时,fork出一个子进程,由于子进程..
原创
发布博客 2022.05.23 ·
2567 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

图解知识点--http\https

1.TCP,三次握手,四次挥手过程2.SSL层两次非对称+一次对称加密过程
原创
发布博客 2022.05.22 ·
221 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

Android 如何实现高效跨进程传递大数据

第一.可以实现进程间通信的方式1.管道,一对一通信,两次拷贝,不满足一对多和效率方面要求2.socket通信,一对多,性能太低,而且不安全3.共享内存,多对多,0拷贝,效率高,但是不安全4.binder,一对多,一次拷贝,效率高,实名安全第二.安卓系统中都用到了哪些进程间通信方式(应该是都用了)1.socket通信,SystemService进程和Zygote进程的通信方式就是scoket,那是因为Zygote进程是先创建的进程,是SystemService进程的父进程,因此只能作为
原创
发布博客 2022.05.22 ·
2598 阅读 ·
2 点赞 ·
0 评论 ·
4 收藏

安卓跨进程高效通信demo

发布资源 2022.05.22 ·
zip

java 线程总结以及JUC编程

第一部分,线程知识回顾总结一。为什么要用多线程?第一,从CPU角度,现在CPU都是多核的,如果只用单线程那就会浪费CPU第二,从JVM角度,JVM中内存分为三部分,堆、栈、非堆,而栈空间则是由线程瓜分的,所以如果说我们只用单线程编程,那么就浪费了大量的栈空间内存。二。线程的生命周期:新建--准备---运行---挂起(分为等待唤醒挂起和超时挂起)---死亡三。线程的创建方式:1.继承Thread,重写run方法,由于java是单继承,所以不推荐2.实现Runnable接口,实现
原创
发布博客 2022.04.19 ·
193 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

AIDL角度分析binder

AIDL,应该说是所有用跨进程通信的最好选择,但是本身缺点也很大:1.两个应用进程必须要包名一致2.定义完方法后需要重新编译,特别是有parcable类型数据需要传递的时候,需要手动添加包3.自动编译生成的java类复杂看不懂那么为什么会有以上缺点呢?我们可不可以改进呢?答案是肯定的。我们先来看一个最基本的aidl:interface IRootService01 { //这是示例代码,可以注掉 void basicTypes(int anInt, long aLo
原创
发布博客 2022.04.09 ·
2589 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

模拟binder通信的demo

发布资源 2022.04.01 ·
zip

进程间通信之Binder理解之一

这篇文章我觉得写进程间通信,写Binder的介绍,写的非常的好,读了以后对binder有了更深的理解。不过我觉得这篇文章写Binder,写的还是比较虚,都是一些跨进程啊什么的,不是很好理解。于是我根据这篇文章的理解,用App进程、类来模拟进程间通信的过程,自己手写了一个进程间通信。App进程:模拟安卓系统MyBinder类:模拟Binder类Process接口:表示进程ProcessA:A进程ProcessB:B进程SystemServiceManager:模拟系统SystemSe.
原创
发布博客 2022.04.01 ·
459 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

安卓程序前后台判断不准问题解决方案

App监听前后台变化是非常常见的一个需求,我们需要在App切到前台或者后台之后,做一些业务逻辑处理,比如提示用户app进入后台,那么如何监听App前后台变化呢?1.context.registerActivityLifecycleCallbacks方式class MyApp extends Application{ private int mTopActivityCount = 0; private void registerActivityLifecycle() { .
原创
发布博客 2022.03.31 ·
965 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

Activity页面顶层添加view

目前项目在做IM聊天功能,仿照微信的语音接听页面:这个页面看上去好像用一个activity来实现,但是呢,左上角有个小窗口模式,因此不适合用activity来实现,因此想到了自定义一个view,可以动态添加到任何activity页面中。但是遇到了个问题:根据getWindow().getDecorView() 添加进去的view,无法全屏显示(显示到状态栏和底部虚拟按键部分)所以不符合需求,后来发现popupwindow可以实现这个效果,因此又把popupwindow的源码看了一遍,根据po
原创
发布博客 2022.03.31 ·
1213 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

Lifecycle应用

上一篇文章分析了lifecycle的源码,源码真的很枯燥,不过有了上一篇的基础,我们再来分析lifecycle的应用就简单多了。lifecycle应用中最重要的两个类是:LifecycleOwner和LifecycleObserver ,前者是提供lifecycle生命周期的,后者是观察者,我们马上会分析源码,先看应用:自定义一个handler,解决内存泄漏问题:public class LifecycleHandler extends Handler implements Lifecyc...
原创
发布博客 2022.03.29 ·
3314 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Lifecycle 源码分析

lifecycle 生命周期,是什么?为什么要设计这个?如何使用?是什么?生命周期的抽象类为什么要设计?我们都知道,activity和fragment等控件,都是有生命周期,而我们可以在各个生命周期内做相应的操作,比如说oncreate中创建对象,ondestory中销毁对象等。其实这样设计已经非常明确告诉了我们该在哪里做什么事情,但是最大的弊端就是,耦合性太高了,我们封装一些第三控件或者第三方库,会完全和我们的宿主耦合起来,这样就会造成如果使用方没有在相应的生命周期内调用我们的方法,则会出现一些b
原创
发布博客 2022.03.29 ·
2896 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

LiveData源码解析

上一篇文章中分析了ViewModel的源码,其中提到了viewmodel要配合着LiveData来一起使用,那么今天来分析一下LiveData的源码,看看怎么用,有什么注意点。第一部分:源码头文件翻译/** * LiveData is a data holder class that can be observed within a given lifecycle. //这是一个可以被lifecycle对象用来观察数据变化的类。 * This means that an {@link .
原创
发布博客 2022.03.25 ·
2497 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

JVM学习记录浅析二

上一篇文章主要记录了jvm类的加载机制,其实应该趁热打铁把类的加载机制应用- -TInker源码也一起解析的,由于工作原因,只能过两天再分析记录一下。今天主要来记录一下JVM中另外一个重要的模块,内存模型。linux中一切都是文件,但是我觉得在学习分析JVM中,一切皆是内存比较合适:栈空间:线程私有区域,分为方法栈、本地方法栈、程序计数器三部分堆:线程共有区域内存,所有创建的对象都会在堆中分配内存非堆(元空间):线程共有区域,主要保存解析完的类信息、静态变量、常量池,因此生命周期最...
原创
发布博客 2022.03.24 ·
134 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

ViewModel 源码解析

MVVM架构中,会用到ViewModel类,那么这个类原理是什么呢?有什么好处呢?第一部分:源码文档解析/** * ViewModel is a class that is responsible for preparing and managing the data for * an {@link android.app.Activity Activity} or a {@link androidx.fragment.app.Fragment Fragment}. //viewmod
原创
发布博客 2022.03.22 ·
1290 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

ButterKnife源码解析之---源码分析

上篇文章中我们看了ButterKnife的源码文档,看到了如何使用,那么这篇文章我们来分析具体原理。还是以activity中使用为例:public class ExampleActivity extends Activity { //给需要初始化的view添加注解,参数为id @BindView(R.id.title) EditText titleView; @BindView(R.id.subtitle) EditTe.
原创
发布博客 2022.03.19 ·
1327 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

ButterKnife源码解析之---基础文档

ButterKnife的基本使用请参考官方文档,不做过多介绍。其实第三方库在使用的时候,我们都可以从他的源码文档里,找到使用示例,所以我们先从源码的头文档分析起。我们看看源码文档里都给我们介绍了如何使用呢?ButterKnife类头文档原文如下:/** * Field and method binding for Android views. Use this class to simplify finding views and * attaching listeners by binding
原创
发布博客 2022.03.19 ·
199 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

JVM学习记录浅析一

分析类的加载机制前,先来抛出一个单例模式思考:单例模式,最常用的设计模式,线程安全的有五种创建方式:1.饿汉式,由类加载机制保证线程安全,但是可能会浪费资源???2.双重校验懒汉式:双重校验保证线程安全,用则初始化,不用则不初始化3.静态代码块:和懒汉式原理一样,本质也一样4.静态内部类:通过内部类的类加载机制保证线程安全,非要说缺点就是多加载一个类吧5.枚举:也是通过类加载机制保证线程安全,但是他的最大特点就是安全,上面四种方式创建单例模式,但是我们可以通过反射机制来破坏单例模式,
原创
发布博客 2022.03.17 ·
535 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

数据结构随笔

常见的数据结构我们都知道有:队列、栈、数组、链表、树(二叉树、红黑树等)、图,那么怎么记会更好理解呢?还是要从特点出发:1.队列:没有固定的实现方式,可以用数组实现,也可以用链表实现,特点就是先进先出。数据有序,但是数据之间可以没有任何关联2.栈:没有固定的实现方式,可以用数组实现,也可以用链表实现,特点就是先进后出,后进先出。数据也是有序的,但是数据之间可以没有任何关联3.数组:一群没有任何关联的数,按照一定的规则放到一起,数据是有序的。特点就是容量固定,根据下角标查找快,增删慢4.链表:
原创
发布博客 2022.03.12 ·
1199 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

EventBus源码解析

今天开始拆分EventBus源码,废话少说,五步骤,如何使用,源码解析,学到了什么,有什么不足之处第一部分:如何使用 //第二步:注册 接收类 EventBus.getDefault().register(this); //第三步,发送事件 发送事件 事件参数 EventBus.getDefault().post(new Object()); //第四步,注销注册 EventBus.g
原创
发布博客 2022.03.12 ·
2686 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏
加载更多