- 博客(69)
- 资源 (24)
- 问答 (1)
- 收藏
- 关注

原创 retrofit+okhttp源码流程
初始化如下Retrofit.Builder rBuilder = new Retrofit.Builder().client(okHttpClientBuilder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .ba
2021-06-30 17:17:16
133
2

原创 robust原理解析
robust原理解析接上一篇robust使用打基础包的时候,每个类都会被添加public static ChangeQuickRedirect u;静态成员变量查看这个类的源码发现这个是一个接口public interface ChangeQuickRedirect { Object accessDispatch(String methodName, Object[] paramArrayOfObject); boolean isSupport(String methodNam
2021-04-27 15:48:40
2128

原创 leakcanary2.6源码分析
本文基于debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.6'版本分析导入后不需要初始化直接使用通过ContentProvider机制自定义了一个AppWatcherInstaller<application> <provider android:name="leakcanary.internal.AppWatcherInstaller$MainProce
2021-03-15 14:35:24
304

原创 glide 4.10+源码主流程分析
本文章基于glide4.11.0源码分析主流程主流程代码为 Glide.with(activity).load(url).into(target).with方法 @NonNull public static RequestManager with(@NonNull FragmentActivity activity) { return getRetriever(activity).get(activity); }get方法 @NonNullpublic RequestMana
2021-03-08 15:14:39
193

原创 eventbus流程源码跟踪
eventbus是一个很常见的android库,平时开发用的也比较多但是会用和了解它的原理是不一样的,今天主要通过正常的一条eventbus流程,来分析一下它的内部实现首先还是看一下基本用法在oncrate或者onresume注册 根据需求在不同的地方注册EventBus.getDefault().register(this)对应的在相应的ondestory onstop中取消注册E...
2019-09-18 14:22:44
293

原创 okhttp3源码解析
基本用法介绍okhttp一直是一个应用非常广泛的网络框架。 首先看一下okhttp的基本用法 var client = OkHttpClient() var request = Request.Builder().url(&quot;http://www.baidu.com&quot;).get().build() var call = client.newCa...
2018-07-12 10:51:29
270

原创 tinker热修复gradle接入
今天研究了一天的热修复,热修复,简单的来讲就是在不需要发包的情况下,修改你线上应用的bug,接入使用后对于我这种小白来说还是很神奇的,同时也考虑了一下,要不要接入我们的项目中,这样就不用因为一个小BUG而去再次发包了,不过,就算要接入项目中,也还有很多坑需要踩,tinker有俩种接入方式,一种命令行接入,一种是gradle接入,本篇只讲gradle接入,下篇我在补充命令行,主要用于自己做个记录,把踩
2017-03-13 17:43:41
6783
15
原创 仿高德地图首页效果,简单代码实现
2021/11/10日高德的首页效果是这样的然后我的效果关键代码 behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { //3 STATE_EXPANDED 4 STATE_COLLAPSED 5 S
2021-11-10 14:28:17
1666
原创 flutter知识
flutter知识几乎所有的ui和功能都是widgetflutter是单线程程序入口为void main() { runApp(myApp1());}class MyApp3 extends StatelessWidget需要添加padding可以使用ContainerWidget titleSection = new Container( padding: const EdgeInsets.all(32.0)布局分为行和列横向布局用Row垂直布局用Columnn
2021-10-24 10:16:16
3650
原创 jetpack之navigation
navigation基本用法如下定义基础跳转fragmentNavHostFragment在首页的layout中如我的首页是homefragment <fragment android:id="@+id/my_nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_
2021-07-14 16:36:20
214
原创 jetppack之lifecycle
lifecycle通过lifecycleOwner.getLifecycle().addObserver(this)给presenter添加lifecycle,fragment和activity默认实现了lifecycleowner,在presenter里面注解@OnLifecycleEvent,当生命周期变化后就会回调这个对应的方法原理android 9.0ComponentActivity默认实现了LifecycleOwner,lifecycle的一个接口类,在oncreate的时候生成了一个re
2021-07-12 14:41:39
179
原创 jetpack之viewmodel
viewmodelviewmodel一般和livedata结合使用,viewmodel是一个可以感知fragment生命周期的,用来做数据存储的一个库解决网络请求,异步操作带来的内存泄漏问题,fragment传递数据不方便的问题,解决屏幕旋转导致的数据销毁问题。原理解析ViewModelProviders.of方法创建AndroidViewModelFactory,ViewModelStore根据这俩个参数创建ViewModelProvider,在调用get方法获取viewmodel实例@Non
2021-07-12 14:40:26
169
原创 jetpack之pagging
paging分页库基本使用方式1,创建数据源(网络,数据库,本地测试)class StudentDataSource : PositionalDataSource<Student>() { override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Student>) { callback.onResult(getStudents(0, PAGE_S
2021-07-12 14:32:52
382
原创 jetpack之livedata
livedata观察者模式构建的一个和生命周期有关系的一个库,可以减少内存泄漏,保证UI状态和数据的统一,不需要手动处理生命周期的变化一般用到的都是LifecycleBoundObserver,他有一个statechange方法,当生命周期变化后,会通知livedata去更新数据,如果生命周期大于start,就会回调onchange方法,生命周期结束,会移除这个mObserver相关代码如下livedata添加监听的时候会生成一个LifecycleBoundObserver他继承了Lifecycle
2021-07-12 14:32:18
120
原创 jectpack之room
room数据库使用roombase@Database( entities = [Repo::class, RemoteKeys::class], version = 1, exportSchema = false)abstract class RepoDatabase : RoomDatabase() { abstract fun reposDao(): RepoDao abstract fun remoteKeysDao(): RemoteKeysDao
2021-07-12 14:31:33
353
原创 tinker dex文件修复简单流程跟踪
上篇文章写了tinker的使用方法tinker使用本篇文章简单的分析一下dex文件的修复流程在几年前我对热修复的理解为新apk和旧的apk通过dexbiff算法对比生成差异包,差异包通过比对文件的MD5值,把修改过的文件打进差异包,差异包下发到服务器,下载到手机指定的路径,通过这个下载的路径生成dexclassloader,获取dexclassloader中的的pathlist,在获取Element数组,然后获取系统的pathclassloader和他的element数组,把这个差异包的Eleme
2021-04-30 10:50:47
573
原创 美团robust使用
最近在整理各个热修复的使用方法和原理,第一个研究的是美团的robustgithub地址为robust基本的使用方法其实github上面有,但是我发现我集成花费了一天的时间,还有是有很多坑的所以才写了这篇文章记录一下首先是APP目录的build里面增加我红色箭头标记的带箭头的就是新增的出了增加美团的热修复包外,还增加了权限库和分包库multidexapply plugin: 'com.android.application'//制作补丁时将这个打开,auto-patch-plugin紧跟着co
2021-04-26 11:12:11
4131
6
原创 binservice之binder机制流程分析
binder机制系统中很多机制都涉及到binder机制,所以对binder机制有一个大致的了解是必不可少的。本文从bindService方法出发流程分析为bindService->connection的onServiceConnected触发来了解一下binder机制 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceCo
2021-04-20 16:09:25
431
原创 android搭建maven仓库
首先下载maven仓库软件链接: 下载地址下载完成后解压到某一个目录然后进入目录 启动然后进入本地地址http://localhost:8081/进入仓库输入账号密码初始密码在sonatype-work文件夹下面进入后界面长这样接下来就可以开始新建lib了,打开android studio 新建一个项目,新建一个lib在gradle.properties里面配置相关信息android.useAndroidX=true# Automatically convert third-pa
2021-03-30 14:16:07
3205
原创 ide插件开发 android studio mvp插件
首先放几个坑前面俩个是在别的链接中看到的地址1, idea 开发插件的时候,src 下需要创建包名。不要直接在src 创建文件。否则也会出现 AndroidStudio 插件无效的问题2, JDK版本问题,在此前,尝试用 IDEA 默认的jdk (11),发现运行在AndroidStudio 无效,IDEA 上可以使用。需要切换为 JDK8版本,AndroidStudio、IDEA都可以运行。3,android studio版本需要和ide插件的build版本匹配否则会出现这个图andr
2021-03-25 18:24:55
167
原创 jetpack之workManager官方文档解析
基础介绍workmanager是一个可延期的后台异步任务,可以用来取代以前的android后台调度任务通俗的讲就是可以用来做后台异步任务,那他有什么优势呢,和以前的后台api方法相比有什么区别呢?带着这俩个问题开始往下看兼容性首先workmanager兼容性很好,包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler都可以替换成workmanager,同时支持 API 级别 14,对电量续航也做了优化(省电)基础功能创建方式:通过单
2020-10-10 15:18:18
2533
原创 mac搭建nginx
首先新建一个文件夹进入文件夹目录下载wget http://nginx.org/download/nginx-1.15.3.tar.gz解压tar xvf nginx-1.15.3.tar.gz下载nginx rtmp模块wget https://codeload.github.com/arut/nginx-rtmp-module/tar.gz/v1.2.1解压tar xvf ...
2020-04-06 13:42:31
660
原创 热修复,插件化基础之classloader
java的classloader类的加载过程##android的classloaderbootclassloader:主要用来加载android framwork层的字节码文件pathclassloader :加载已经安装的apk的class文件dexclassloader:用来加载指定目录的字节码文件basedexclassload:父类##双亲代理模型加载class之前,会...
2020-03-09 17:54:50
263
原创 插件化,热修复基础之class文件,dex文件
class文件基本概念:class文件,能被jvm识别,加载并执行的文件格式。一种8位字节的二进制流文件生成方式:1,ide自动build2,javac命令生成class文件执行方式:java命令执行class文件class文件结构加密,最小版本,最大版本,常量池,常量结构体,作用域,this标志,super标志,接口数量,接口,成员变量,成员变量结构体,方法数量,方法,属性数量,属...
2020-03-09 15:20:03
245
原创 插件化,热修复基础之虚拟机
###java虚拟机 jvmjvm整体结构##jvm内存空间java 栈区 它存放的是java方法执行时的所有的数据栈帧 一个栈帧代表一个方法 每个方法的调用就是一个栈帧在虚拟机栈中入栈和出栈本地方法栈:专门为nativie方法服务,也是通过栈帧调用方法区,存储被虚拟机加载的类信息,常量,静态变量等数据。java堆:所有通过new创建的对象的内存都在堆中分配,是虚拟机中最大的一块内...
2020-03-09 14:38:06
226
原创 APP性能优化之-APK瘦身
简单分享APP性能优化之-APK瘦身lib包优化armeabi-v7a,x86 // so库可以只用armeabi-v7a minSdkVersion:21 android 5.0 对比图font文件查询了很多资料,暂时没有好办法,font文件缩减的本质是删除位图,删除无关字形(比如日语韩语),删除字形名称,创建字形的子集,使用后发生大小没有什么变化打包优化shrinkResources...
2019-10-14 14:28:56
220
4
原创 Viewpager2实现类似抖音的主界面
##背景一般上下滑动的全屏界面,都是使用viewpager做。好处是系统封装好了,可以直接调用相应的api就能使用坏处是viewpager的刷新机制比较麻烦,而且往头部添加数据也不是很方便后来有人使用RecyclerView+PagerSnapHelper将recyclerview打造成类似viewpage的效果好处是recyclerview功能强大,能满足大部分需求坏处是这俩个搭配会...
2019-08-08 09:41:19
2862
1
原创 recyclerview+viewpager实现多分类fragment界面 仿京东分类界面
好久没写博客了,今天决定写一篇简单的功能实现热热手这是我2018年10月份在京东app录制的他们的分类界面,今天主要就是实现这样的一个分类的界面整理思路首先整理思路啊。整体界面的实现方式可能很多,但是需要尽可能的用简单的方式,比如左边的分类界面和右边的一起看的话,好像用tablayout+viewpager也可以实现?虽然说他们都是垂直的,我们平时使用的是水平的,但是应该要实现的话也不是问...
2018-10-15 15:06:21
7372
11
原创 android开发艺术探索第四章
view的工作原理DecorView和ViewRoot ViewRoot对应ViewRootImpl,他是链接windowsmanager和DecorView的枢纽 viewroot控制view的三大流程 流程如图所示 DecorView中包含一个标题栏和一个内容栏 内容栏的id为content,在setcontentview的时候设置view进去MeasureSpecMeasureS
2018-04-28 13:38:31
244
原创 android开发艺术研讨第二章简要记录
ipc,跨进程通信,android通过binder机制进行进程中的通信,在android中一个进程一般指一个应用,也可以通过在androidmanifes中指定process属性来实现多进程多进程实现很简单,但是多进程间的数据传递不简单当启动一个不同进程的activity时,application会重新执行oncreate方法,同时,不同的进程,相同的类会分配到不同的地址空间比如在
2018-04-27 14:48:10
293
原创 android开发艺术探索第一章总结
异常情况下acitivty生命周期,比如在屏幕旋转的时候 onSaveInstanceState->oncrate->onRestoreInstanceState分别执行3个方法onSaveInstanceState在onstop方法之前调用,用来保存信息。onRestoreInstanceState在onstart之后调用,用来取出信息,当此方法被调用的时候,bundle一定有值很多...
2018-03-06 18:18:37
254
原创 解决因为gradle版本不同导致打开不同的项目build无敌慢的问题
如题,相信这个问题很多人都碰到过,比如在github看到一个很不错的项目。clone下来打开,然后界面一直处于死机状态,新手玩家可能会觉得这个项目好像有问题?不给任何提示就是打不开其实这是因为你在网上cloen下来的项目gradle版本和你的不同导致,可能在你的本地没有网上项目的gradle版本,导致android studio认为这个版本是你需要下载的,然后开始帮你下载,而且android stu
2018-01-24 11:47:04
4160
原创 android 8.0 报错StartForeground Bad Notification Error 解决方法
今天升级了android8.0 并且在一个8.0的系统上运行,居然报错了 报错日志就是标题这个了 也就是使用startForeground方法开启通知的时候报错的 在android8.0后 需要给notification设置一个channelid不要问我为什么 解决方法如下//新增--------------------------------------------- String CH
2017-12-20 14:40:54
35769
15
原创 自定义view的一些方法和参数介绍之第一期path和canvas
canvas家族//设置画板的填充色(一般为整个view) canvas.drawColor(Color.YELLOW);//画圆前俩个参数为圆心的X坐标,圆心的Y坐标,第三个参数为半径//依据的坐标系原点为view的左上角初始点作为原点(图一) canvas.drawCircle(cx, cy, r, mPaint);
2017-11-02 11:20:44
299
原创 Android 的Canvas的drawArc方法参数介绍
Canvas有一个方法drawArc这是用来绘制一个圆弧的 方法名为drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)里面参数很多,今天网上搜索了一下,都说的不准确和详细,所以写个博客记录一下首先看下
2017-10-25 18:38:23
6631
原创 HashMap源码解析
源码第一篇(hashmap)简单理解篇本篇讲解hashmap的put 方法的原理和一些源码的解析下面先简单的介绍一下hashmap (hashmap包位置为import java.util.HashMap)hashmap的数据结构是数组和链表的结合 为什么会是这个结构,后面会讲到hashmap是线程不安全的 非线程安全是指多线程操作同一个对象可能会出现问题 也就是说,我新建一个对象,用100
2017-10-16 11:19:58
237
原创 andorid面试题和笔记(持续更新)(framework)
事件分发机制首先事件指的是触摸事件,首先是viewgroup的事件分发,viewgroup里面有子view,ViewGroup的相关事件有三个:onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。简单的来说就是viewgroup遍历自己的子view,如果
2017-10-09 13:42:14
662
原创 values-sw<n>dp,px,dp,dpi
1,values-swdp用来做适配,表示最小宽度 最小宽度计算方法sw=160*手机宽度像素/dpidpi获得方式dpi= context.getResources().getDisplayMetrics().densityDpi比如我的vivo x7plus分辨率为1080*1920 根据上面公式得到dpi=480那么sw=160*1080/480=360dp所以会在values-sw360
2017-09-27 16:50:52
967
原创 带你实现拍照||从相册选择->裁剪->上传服务器
涉及到的知识点: 1,调用系统拍照功能,拿到图片进行裁剪,上传服务器 2,调用手机相册,拿到图片进行裁剪,上传服务器 3,拍照权限,读取写入存储卡权限的请求和处理。 4,上传服务器使用的我以前封装的retrofit2和rxjava的类有兴趣的可以看retrofit2+rxjava2封装解析 下面进入正题1,实现拍照功能首先我在主界面放了俩个按钮一个点击拍照,一个点击从相册获取,底部放置一个
2017-09-12 17:24:59
553
原创 漂亮的viewpager画廊效果
首先看下效果图和整个项目的结构 很简单的一个项目,这也是我在简书写的第一个项目,虽然简单,但是我觉得很漂亮现在开始分析代码首先看下MainActivity的代码public class MainActivity extends AppCompatActivity { private int pagerWidth; private ViewPager mViewPager;
2017-09-01 16:13:35
3856
recyclerview+viewpager
2018-10-15
tinker热修复gradle接入
2017-10-12
带你实现拍照||从相册选择->裁剪->上传服务器
2017-09-12
漂亮的画廊viewpager
2017-09-01
rxjava2+retrofit2
2017-04-26
自定义的FragmentTabHost
2016-11-30
网易布局viewpager+fragment+scrollview+recycleview
2016-09-29
我的第一条blink。
2021-06-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人