自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Glide学习

文章推荐我认为对我启发最大的文章是这一篇,这篇主要是讲思想。然后源码上对我启发最大的是这一篇。除了Glide的现成方案之外,还要学习没有第三方框架的时候,Bitmap的优化方案总体逻辑...

2022-04-24 21:24:54 1255 2

原创 从0开始封装一套项目的网络请求框架

前言Android进行网络请求,一般是通过Retrofit配合RxJava来实现。需要注意的是,在项目中,是不可能直接在每一个请求的地方直接裸着用框架,而是一定在自己的项目中对框架封装了一层,实际使用的是封装的这一层。本篇文章就来介绍一种封装方案,在项目中可以使用。此方案肯定有不足的地方,还请批评指正。用到的知识Kotlin、Retrofit,RxJava,OkHttp步骤介绍1.api介绍在这里使用鸿洋大神的开放api,链接点这里。只使用登录api即可,其他的api都是一样的方式。url:

2022-04-21 20:37:52 1100 1

原创 Android启动流程

前言本文是本人通过学习各位前辈的博客,结合自己对Android的理解所作。如有错误,还请批评指正。1.总的介绍几个注意点:①idle是内核空间的鼻祖,init是用户空间的鼻祖。Zygote是Java进程的鼻祖②Zygote既有native层,也有java层。③JNI就是负责native层和java层的通信的,起到一个桥梁作用。2.分别介绍各个角色①init进程init进程是Linux中的一个核心进程,在Linux中,所有的进程都是由init进程fork出来的,比如Zygote进程。它完

2022-04-18 21:16:58 1788

原创 再学RecyclerView的回收复用机制

RecyclerView的回收复用机制

2022-07-24 16:40:07 637 2

原创 View的工作原理

Android自定义View

2022-07-17 17:31:22 386 1

原创 【IPC实战④】Binder连接池

前言在前面关于AIDL的讲解中,基本是一个AIDL对应一个Service。具体实现是把AIDL的实现类放到Sevice里面了,如图所以就会有很大的局限性,即一个Service只能对应一个AIDL,假如说有多个模块,每个模块都有AIDL需求,那么就需要写多个Service,很显然这是很笨的写法,而Binder连接池就可以比较优雅的实现一个Service对应多个AIDL的需求1.总体思路介绍首先要把Stub的实现类和Service抽离,不让Service和他们有直接关系。再就是在Service的onB

2022-05-21 17:03:57 519 2

原创 Android IPC方式总结

前言经过半个月的学习,目前我对Android IPC机制有了更全面的理解。结合《Android开发艺术探索》,在这里做个总结IPC方式有哪些①

2022-05-18 11:26:54 592 2

原创 【IPC实战③】ContentProvider实战

好文章推荐

2022-05-17 17:53:01 233

原创 【IPC实战②】AIDL实战

前言关于AIDL的原理以及详细介绍,我在Binder机制原理一文中有讲到,这里就不再赘述。本篇文章以实战为核心,写一个AIDL操作实例出来AIDL与Messenger的区别就是AIDL支持并发处理请求,也就是多进程,多线程的情况。而Messenger是多进程,单线程demo的github地址:https://github.com/LJHnb666666/AIDLDemo1.实现思路还是需要客户端,服务端Service。除此之外,还需要一个实体类做客户端和服务端交互的Bean,还需要AIDL文件定义

2022-05-10 17:26:21 346

原创 【IPC实战①】Messenger实战

前言在Android中,IPC的方式有很多种,之前我都没听说过Messenger,但是通过近期学习后,我发现它也是一种Android常用的IPC方式,底层是AIDL实现。特此记录有关学习

2022-05-10 11:29:03 326

原创 IntentFilter的匹配规则随想录

前言本人对Activity的两种启动,尤其是隐式启动有了新的理解,特此记录1.Activity两种启动方式①显式调用:需要明确地指定被启动对象的组件信息,包括包名和类名(一般用在一个应用程序内部)例如Intent intent = new Intent();intent.setClass(SecondActivity.this,ThirdActivity.class);startActivity(intent);②隐式调用:需要Intent能够匹配目标组件的IntentFilter中所设

2022-05-08 10:53:53 161

原创 Activity启动模式随想录

前言记录本人对Activity启动模式的新理解1.指定启动模式的两种方式方式一:在Menifest文件中指定launchMode属性方式二:启动Activity的时候,指定Flags(这种方式优先级更高)2.启动的Bug示例当一个非Activity类型的Context去启动Activity的时候就会报错。这是因为非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈。比如ActivityA要启动ActivityB,以standard模式启动。那么B肯

2022-05-05 21:13:54 200

原创 Activity生命周期随想录

前言读了《Android开发艺术探索》第一章以后,对Activity生命周期有了自己的一些小理解。特此记录1.生命周期分类就像书中所说,Activity的生命周期分为两类,一类是典型情况下的生命周期,一类是异常情况下的生命周期2.关于典型生命周期值得记录的想法①onStart和onStop是从是否可见的角度来回调的,onResume和onPause是从是否可以交互的角度来回调的。②onPause不能做一些太耗时的操作。为什么呢?因为在一个Activity启动另外一个Activity的时候,生

2022-05-05 20:38:10 213

原创 RxJava原理学习

这是对RxJava设计模式以及源码的介绍

2022-04-30 16:14:44 6456 1

原创 kt面试文章推荐

金三银四必备,全面总结 Kotlin 面试知识点

2022-04-23 21:08:10 1237

原创 kt和Java的几个有意思的地方

1.Java调用kt文件中的方法①新建两个文件,一个是Java类,一个是kt文件②在Java类的Client中调用KTServer的方法,如图会注意到在KTServer后面加了个Kt2.kt调用Java中的方法首先Java类这样写①然后在ktClient中,如果想使用这个in,就要这样JavaServer.`in`因为in在kt中是个关键字,所以要区分②还有调用getString方法是这样JavaServer().stringkt自动把get省掉了③感叹号还有一个有意思

2022-04-23 15:24:42 3450

原创 Binder机制原理

Binder是什么?可以理解为Android的血管。是一种进程间通信的机制。比如Activity,Service需要和AMS通信的时候,就需要Binder除了进程间通信,也可以把Binder理解为一种虚拟物理设备驱动。虚拟表示没有实体,和键盘鼠标不一样。Binder是虚拟的。在应用层,也可以把Binder理解为一个是一个能发起进程间通信的Java类为什么是Binder?Linux也有一些很优秀的进程间通信机制,例如管道,消息队列,共享内存,socket等,但是为什么Android使用Binder而

2022-04-15 20:57:19 5954

原创 HashMap你知道多少

总结首先它的底层结构是xxx,它的put方法原理是xxx。下标计算原理是xxx,当put元素达到一定值的时候会进行扩容,其扩容原理是xxx,其容量都是2的n次方,原因是xxx。在jdk1.8之前,是头插法,1.8之后改为了尾插法,原因是xxx。同时1.8之前和1.8之后都是线程不安全的,体现在xxx。1.8之后还引入了红黑树,好处是xxx1.底层结构首先它的底层是数组+链表组成的散列表。这种能够综合数组(查找效率高)和链表(增删效率高)的优点,提高效率。2.put一开始数组的容量为0,Has

2022-03-10 16:41:59 108

原创 实习做了啥

2022-02-06 15:50:26 1214 1

原创 记录webView显示空白的又一坑

问题描述今天在app用webView加载网页。突然出现了加载不出来的情况。webView.getUrl()都能得到我要加载的Url。但是就是不显示我要加载的网页。在浏览器上是可以显示的解决思路1.因为之前遇到过类似的问题,是证书问题,所以我就看上次的解决方案能否解决。如图证书有问题,选择继续加载。但是,还是没解决2.各种百度,尝试各种方案比如mWebSettings.setDomStorageEnabled(true);//开启本地DOM存储我以为是html网页太大了,所以我就开启本

2022-01-14 12:08:58 2709

原创 Android面试计网面经大全【持续更新中。。。】

前言本篇文章为本人面试以及空闲时间整理的计网面试常见问题。供本人复习之用。分享给大家。大家可以评论补充哦!因为面试常见问题一般都是网络层,传输层以及应用层。所以我就按自上而下的顺序,来分享最后一次更新时间:2021.12.30一、应用层常见问题1.DNS如何得到ip地址假定域名为 m.xyz.com 的主机想知道另一台主机( 域名为 y.abc.com )的 IP 地址。例如,主机 m.xyz.com 打算发送邮件给主机 y.abc.com。这时候就必须知道主机 y.abc.com 的 IP 地

2021-12-30 15:55:43 1746 1

原创 webView因证书问题显示一片空白

问题现象webview一片空白,而各种浏览器都可以访问此url。但是会提示证书不安全的问题解决思路因为不管是手机访问,还是浏览器访问,都会提示证书问题,而webview有一个setWebViewClient(new MyWebViewCliecnt())方法,当webview加载的网页出现证书问题的时候,就会回调MyWebViewCliecnt的@Overridepublic void onReceivedSslError(final WebView view, final SslErrorHa

2021-12-22 14:36:43 947

原创 组件化学习

组件化学习(1)思想及实现方式组件化学习(2)Arouter原理学习组件化学习(3)ARouter中的Path和Group注解

2021-12-02 18:00:13 211

原创 组件化学习(3)ARouter中的Path和Group注解

这里就不对ARouter进行全面分析了,而是把其思想抽象出来理解1.介绍下Group和Path在上一篇文章中也提到过,Group就是组,Path就是组里面具体的类。在ARouter的api模块中,有针对Group和Path的接口ARouterGroup和ARouterPath。如下public interface ARouterGroup { Map<String, Class<? extends ARouterPath>> getGroupMap();}ARou

2021-12-02 15:25:52 2964

原创 组件化学习(2)Arouter原理学习

1.Arouter原理一句话总结ARouter的原理:就像上篇文章讲到的全局Map一样,它有一个在编译期生成的路由表。虽然各模块之间没有横向依赖,但是信息传递的时候,可以通过查找路由表,找到需要通信的模块的class对象,从而进行通信。也就是说ARouter的核心就是路由表ARouter是编译期的框架既然有表,那就有表中元素的register和get。register的时机,就显得很重要了。如果是在运行时register,则用户可能会感觉到卡顿。所以,ARouter选择了在编译时期register。

2021-12-02 10:35:35 620

原创 组件化学习(1)思想及实现方式

1.组件化的介绍我认为组件化,就是整个项目由app外壳,若干业务组件,以及公共基础组件构成。如图所示我认为组件化最明显的特点就是:各个业务模块之间没有直接的横向依赖。意义:不相互依赖,但是可以相互交互;高度解耦;自由拆卸2.组件化的部署关于如何将项目组件化,网上有大量的学习资源,我推荐一篇文章,写的超级详细:就是这一篇文章3.组件之间的通信:当然最常用的还是阿里开源的ARouter。这个就不多介绍了,但是除了这种方式,还有其他几个比较原始的方式①使用EventBus缺点:EventBus

2021-12-01 10:03:20 1978 1

原创 更新项目用到的sdk的标准流程

更新项目用到的sdk的标准流程①首先将项目用到的远程依赖改为本地依赖。这个作用是让项目使用本地的库,就先断开和远端的库的连接。这样就方便我们在本地更改sdk,然后直接就可以测试。②本地进行sdk代码③sdk更新后push,让公司专业人员进行代码更正④代码没问题后,进行版本更新步骤:(1)在sdk项目的需要更新的模块的build.gradle中,找到这个就是更新远程依赖的方法,版本就在最后一行。我们更新的时候,把更新后的版本号写到那里,然后进行下一步(2)然后切换渠道!!! 这个很重要!

2021-11-29 22:05:26 1111

原创 升级谷歌AdmobSDK的时候学到的东西

1.引用第三方SDK的策略用第三方SDK的时候,可以不直接用,而是自己封装一套SDK,然后在自己封装的SDK里面再引用第三方SDK,这样当第三方SDK升级的时候,前面的业务代码和我们自己封装的SDK代码逻辑都不用变,直接替换直接引用第三方SDK的那里就可以。其实就是封装的思想2.用github上传项目失败我现在是遇到了三种情况①SSH公钥丢失我用的SSH拉下来的,SSH和HTTPS的区别就是,SSH需要一个公钥,而我的公钥又被删了,所以总是push不上去。所以后面项目尽量用HTTPS拉,会方便很

2021-11-25 23:59:00 2000

原创 取消远程依赖,用本地依赖

意思就是说不用远程的sdk,而是把sdk下载到本地,和项目在同一目录,然后取消原来引用的远程sdk,使用本地的sdk上面是项目的根目录下的settings.gradle然后再在项目引用的库中的build.gradle中这样就可以在本地使用这个库了,不用再在比如github上面导入了...

2021-11-17 21:03:58 2451

原创 项目,怎么打包

1.这时候,需要切换渠道当项目文件的图片是如图所示时,则表明需要切换到相应渠道了图标是这样的,因为我没有用google渠道。那么切换到google渠道就行了2.如何打包用AS运行项目,每种渠道可以有两种模式,即Debug模式和Release模式。(两种模式可以通过Build Variant进行更改)Debug模式一般是我们私下测试用的,可以使用默认的debug.keystore进行签名。Release一般是发布在市场上的正式版。我们正式发布项目的时候是不能使用debug.keystore的,而

2021-11-15 19:33:36 8962 6

原创 杂七杂八的学习

1.渠道,是干啥的?渠道,就是用来给项目打包的。说白了,就是不同的应用商店,对app有不同的要求,build Variants就是为不同的应用商店给项目打包。比如谷歌应用商店,华为应用商店,对app的上架要求不同。那么就需要将项目分别打包成他们想要的样子,才能上架。设置渠道,在Build Variants里面,有一个Official版本,就是官方渠道,也就是app官网上的版本,这个就没有啥限制了,由公司自己决定。渠道还可以用来携带信息,比如不同类型的手机,供运维的同学统计2.Dialog顾名思

2021-11-11 17:38:09 2717

原创 补补网络缺口

1.什么是零拷贝零拷贝,不是不需要拷贝,而是尽可能地减少不必要的拷贝,以节省CPU的资源,减少因上下文切换而造成的资源浪费上下文切换:比如用户在占着CPU,然后此时操作系统要用,那么就要把用户挪开,把操作系统放上去。也就是把上一个进程的东西挪走,下一个进程的东西挪进来。这就是一次上下文切换重点:Linux用到的零拷贝①传统的数据传送buffer = File.readSocket.send(buffer)此时会经过4次拷贝,4次上下文切换。先来看四次拷贝再来看四次上下文切换②M

2021-11-09 17:45:25 3207

原创 谷歌AdMob广告学习

学的杂七杂八的东西1.ss协议是什么我总结一下,ss/ssr的目的就是用来翻q的,侧重于流量混淆加密,穿透防火q是第一位,使用socket5代理。而vpn的目的是用来加密企业数据的,安全是第一位,本意并非是翻q对于vpn来说安全是第一位的,而对于ss/ssr来说穿透防火q是第一位,抗干扰性强,而且对流量做了混淆,(所有流量在通过防火q的时候,基本上都被识别为普通流量,也就是说你翻q了,但是相关部门是检测不到你在翻q的。)两者的出发点和着重点就不同,ss/ssr更注重流量的混淆加密。参考文章2. 配

2021-11-08 20:57:12 2751 3

原创 Retrofit学习

rest规范rest即Representational State Transfer,翻译过来就是(资源)表现层状态转换。我说下我对这个规范的理解资源,即一个URI代表一个资源,比如是一个文本,一个图片等。表现层,即资源的表现形式,比如文本可以用txt形式表现,图片可以用jpg,png形式表现。状态转换,即将资源的状态进行转换,比如得到资源,更改资源,删除资源等,对应HTTP四个方法,即GET,POST,PUT,DELETE。它有两个非常值得注意的点,第一个就是,URI中不应该包括动词(最常见的URI

2021-11-07 16:15:50 194

原创 OkHttp源码解析(二)五大拦截器

一.拦截器基本介绍在前面分发器的介绍中,可以看到通过getResponseWithInterceptorChain这一个方法,就可以获得响应。这个方法里面是这样的除了两个用户可以自己添加的拦截器之外,剩下的五个是默认的拦截器。他们之间是用责任链模式连接在一起责任链模式责任链上的处理者负责处理请求,客户只需要将请求发送到责任链即可,无须关心请求的处理细节和请求的传递,所以职 责链将请求的发送者和请求的处理者解耦了。比如点个外卖,它的流程是这样的我不必关心内部是具体怎么给我做的饭,美团外卖只管提

2021-11-06 15:55:30 1633

原创 OKHttp源码解析(一)分发器

一.OkHttp介绍OkHttp是由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。使用它有以下好处1.支持HTTP2.0并允许对同一主机的所有请求共享一个套接字2.通过socket连接池,减少了请求延迟3.默认通过GZip压缩数据4.响应缓存,避免了重复请求的网络5.请求失败自动重试主机的其他ip,自动重定向至于如何实现这些的,相信看完整个OkHttp的介绍,你就清楚了二.OkHttp的基本使用(以Get请求为例)引入依赖。1.首先创建O

2021-11-01 18:07:44 346

原创 实习需要学的东西(暂定)

com.squareup.retrofit2:retrofit:2.1.0com.squareup.retrofit2:adapter-rxjava2:2.3.0com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34shadowsocksjnicom.android.billingclient:billing还有google的Admob SDK谷歌广告的升级

2021-10-29 20:53:15 1084

原创 【知识体系】面试官您好!这是我的知识体系

专业课(罗列部分)《计算机科学导论》《程序设计基础》《面向对象程序设计》《离散数学》《Web前端设计》《概率论与数理统计》《数据结构》《操作系统原理》《数据库系统概论》《计算机组成原理》《算法设计与分析》《计算机网络》成绩排名:年级第二,前1%额外自己学的,并记录在博客中的基础部分C语言基础C++语言基础Java语言基础Web前端基础Kotlin语言基础...

2021-10-09 12:46:46 179

原创 记载常见排序的代码【Java】

public class Main { public static void main(String[] args) { int[] array = {3,2,4,1,5}; int[] temp = new int[array.length]; radixSort(array); System.out.println(Arrays.toString(array)); } //基数排序 public stat

2021-10-08 10:26:45 82

原创 【小项目整理】面试官你好!这是我的项目经验

项目一:流式布局实战项目完成后,记载的博客。包括思路,知识点,代码,效果等使用技术:自定义View/ViewGroup,递归算法责任描述:项目的全部开发技术点描述:①onMeasure方法会调用多次。自定义ViewGroup中,onMeasure方法和onLayout方法必须重写。且onMeasure方法会调用多次,因此有些变量需要在onMeasure方法的开始就进行一些清空操作(为了避免内存抖动,不要new,而是clear)②onMeasure方法由父控件调用。当控件的父控件要放置该

2021-10-04 14:46:44 294

空空如也

空空如也

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

TA关注的人

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