Android
文章平均质量分 67
柚子君下
我要养成写博客的习惯!!
展开
-
ConstraintLayout源码
国内太难看源码了, 直接把Google的源码贴过来.原创 2023-01-11 17:00:35 · 353 阅读 · 1 评论 -
自定义Kotlin协程调度器
从上述例子中,我们可以看到系统预置的Default调度器是怎么执行的,我们可以仿照Default调度器来实现自己的调度器。比如说有以下场景,我希望我的任务都在子线程中顺序执行,那我们可以定义一个线程数为1的调度器,如下。我们定义一个线程池,实现调度器中的dispatch方法,直接在单线程池中执行即可。或者我们参考Default实现,规定最大线程数即可。使用办法如下。...原创 2022-08-13 16:09:57 · 1251 阅读 · 0 评论 -
在安卓手机上搭建一台微型服务器
相信很多人手上都有一些闲置的手机,那可不可以在这些手机上搭建一个服务器呢?下面我们分享一种搭建简易服务器的思路。ROOT并非必须,但是ROOT后我们可以更方面的进行保活等操作,各个品牌的手机root方法不尽相同,下面简单介绍下小米手机的一种ROOT办法。(注意,手机Root后会变的不再安全,非专业人士不要操作)因为后续需要输入recovery镜像,所以我们需要首先解锁bootloader锁。直接在小米的官网上申请就行,按照操作提示一步一步操作就好这里我们选择刷入第三方的recovery工具,可以在下方找到原创 2022-06-29 19:35:42 · 12260 阅读 · 0 评论 -
RxJava线程调度浅析
一、结论本身不从头介绍RxJava的用法,仅对RxJava的线程调度做出一点解说,为了节约阅读时间,先把本文得到的几条结论写到前面在不指定线程的情况下,RxJava遵循线程不变的原则,即:在哪个线程调用subscribe,就在哪个线程消费;在哪个线程生产事件,就在哪个线程消费事件;observeOn可以调用多次,每次调用影响它直接的下级Subscriber;但是subscribeOn只能调用一次;Schedulers.newThread每次都会创建一个新的线程来执行任务。Schedulers.i原创 2022-06-01 20:23:29 · 1048 阅读 · 0 评论 -
Android 用MMKV替代SharedPreferences
MMKV简介MMKV是腾讯基于mmap内存映射开发的通用key-value组件,底层使用protobuf实现序列化\反序列化功能,性能高,稳定性强。并且已在GitHub上开源,地址如下https://github.com/Tencent/MMKVMMKV的原理如下内存准备通过mmap内存映射文件,提供一段可供随时写入的内存块,App只管往里面写数据,由操作系统负责将内存回写到文件,不必担心Crash导致数据丢失。数据组织数据序列化方面,MMKV使用protobuf协议,protobuf在原创 2022-05-18 19:19:36 · 689 阅读 · 0 评论 -
Android中使用CoAP协议
什么是CoAP协议CoAP(Constrained Application Protocol)协议是一种物联网协议。与传统的PC、智能手机相比,物联网设备大多是资源限制型的,有限的CPU、RAM、Flash、网络带宽等。对于这些设备来说,直接使用TCP和HTTP协议是不太现实的。CoAP协议主要有以下特征受限制的小型设备的Web传输协议(类似于HTTP)异步信息交换低开销,非常易于解析支持URI和内容类型代理和缓存功能从抽象协议层,CoAP可以表示为如上所示,CoAP协议分为Requ原创 2022-03-20 20:36:56 · 3443 阅读 · 0 评论 -
Android中利用OkHttp+Retrofit+kotlin协程发出网络请求
目前Android端流行的网络请求模式是,OkHttp+retrofit2+RxJava,但是kotlin协程横空出世之后,RxJava的某些特性与kotlin协程出现了冲突,那我们能抛开RxJava吗? 当然可以,这里,我们示范一种OkHttp+retrofit2+kotlin协程的网络请求模式。添加依赖模块的build.gradle添加以下依赖dependencies { implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coro原创 2022-03-06 18:03:32 · 4445 阅读 · 0 评论 -
Android findViewById及替代方案大全
自打学习Android开发以来,findViewById就是我使用最频繁的函数之一。findViewById可为灵活至极,但是又让人爱恨交加。那findViewById究竟有哪些优缺点,他又有哪些替代方案呢?今天就来做一个总结findViewByIdfindViewById的原理findViewById的原理非常简单,我们都知道Android中的View结构是一个树形结构,findViewById就是自树的根节点,依次遍历其子节点,知道找到目标的id。findViewById的优点还是先夸夸fi原创 2022-03-06 11:51:44 · 11746 阅读 · 2 评论 -
EventBus学习
概述EventBus概念GitHub地址基本用法一些不常用的用法走读源码可以学习到什么原创 2021-06-15 10:53:58 · 230 阅读 · 0 评论 -
Jetpack Compose学习之rememberCoroutineScope
rememberCoroutineScope是干什么的?一句话,类似于GlobalScope一样,这个就是让你在Composable中使用协程的看代码@Composablefun HelloContent() { val inputText = remember { mutableStateOf("") } val scope = rememberCoroutineScope() Column(modifier = Modifier.padding(16.dp)) {原创 2021-04-26 16:02:52 · 2291 阅读 · 2 评论 -
Jetpack Compose学习之LaunchedEffect
是干什么的?怎么用?LaunchedEffect是什么?LaunchedEffect就是能让你在Composable中使用协程。@Composablefun HelloContent() { val inputText = remember { mutableStateOf("") } Column(modifier = Modifier.padding(16.dp)) { LaunchedEffect(key1 = inputText.value, bloc原创 2021-04-26 14:15:17 · 4561 阅读 · 5 评论 -
Jetpack Compose学习之mutableStateOf与remember是什么
刚开始学jetpack compose,会看到两个函数,mutableStateOf和remember,这俩货是干什么的?假如我们要实现下面这个页面一个标签,一个输入框,那我们马上开搞 @Composable fun HelloContent() { Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello",原创 2021-04-25 11:38:48 · 7829 阅读 · 7 评论 -
Android 自定义Crash监控
如果我们需要监控Android App中发生的Crash异常,只需要做下面动作 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { xxxx原创 2021-04-13 09:50:48 · 215 阅读 · 0 评论 -
Android中自定义一个java.lang.Object类会怎么样
我们发现,Android中自定义一个java.lang.Object类会怎么样?可以编译成功吗?答案是可以的。我很震惊。为什么不会有问题呢?这就回到ClassLoader的双亲委托机制,详细请参看文章https://blog.csdn.net/weixin_43662090/article/details/113626287,不再重复啰嗦所以,Android最终会委托到ClassLoader中进行加载,结果发现,ClassLoader中加载过了,所以不会重新进行加载。就算这个时候.原创 2021-04-06 18:27:23 · 174 阅读 · 0 评论 -
Android实现圆角的方案
罗列一下Android实现圆角有哪些方案使用xml的shape来实现圆角<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="10dp" /> <solid android:原创 2021-04-06 17:52:14 · 1470 阅读 · 0 评论 -
Android CardView实现圆角效果
使用cardCornerRadius就可以直接实现圆角效果,代码如下 <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="match_parent" app:cardBackgroundColor="@color/gray_d9d9d9" app:contentPadding="1px"原创 2021-04-06 17:17:50 · 2510 阅读 · 0 评论 -
Android有意思的事件分发
假设有这么一道题目,ScrollView里面包着Button,描述上滑的完整事件。我们构建一个布局<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/原创 2021-04-05 20:49:01 · 114 阅读 · 0 评论 -
Java内部类持有外部类的应用
如下代码package com.plbear.leakcanaryimport android.content.Intentimport android.os.Bundleimport android.os.PersistableBundleimport androidx.appcompat.app.AppCompatActivityclass MainActivity : AppCompatActivity() { ... inner class Data {原创 2021-04-05 16:31:04 · 201 阅读 · 0 评论 -
Kotlin 扩展函数的原理
Kotlin有一个非常好的特性,就是扩展函数,非常好用如下package com.plbear.leakcanaryimport android.app.Activityimport android.util.Logfun logcat(msg: String?) { Log.e("yanlog", msg ?: "null")}fun Activity.myStop() { this.finish()}fun String?.toNotNUll(tmp: Str原创 2021-04-05 16:07:00 · 732 阅读 · 0 评论 -
Android 线程的优先级
Android可以在当前线程中调用Process.setThreadPriority来设置当前的线程优先级,如下Thread{ Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO)}.start()看一下这个方法的注释 /** * Set the priority of the calling thread, based on Linux priorities. See * {@link #s原创 2021-04-05 15:50:27 · 789 阅读 · 1 评论 -
Android那些知识点
当点击多任务健之后,Activity的生命周期是怎么样的实际测试结果,会走到onStop里面,然后再次回到前台,会走到onRestart onStart2021-04-02 12:54:40.386 9251-9251/com.plbear.leakcanary E/yanlog: onPause2021-04-02 12:54:40.426 9251-9251/com.plbear.leakcanary E/yanlog: onStop2021-04-02 12:54:45.769 9251原创 2021-04-03 10:13:52 · 142 阅读 · 0 评论 -
OkHttp学习系列之Retrofit
Retrofit严格意义上不是OkHttp的,但是这两个东西联系太紧密了,在Android开发商,经常会把Retrofit和OkHttp混到一起用,很方便!! 所以不得不讲一下Retrofit注意下,这篇文章是讲原理的,不是讲用法的,想学习Retrofit怎么用,不要看这篇文章,纯属浪费时间深入到Retrofit的源码中可以看到,Retrofit的设计是非常精巧的,他利用了动态代理和注解技术,用几个类搭建了一个可扩展性非常好的框架,实在是我辈的楷模。Retrofit的逻辑分成以下三个部分创建代理对原创 2021-03-25 20:38:51 · 211 阅读 · 0 评论 -
我终于学会git rebase命令了
之前因为git的提交历史被老大吐槽, 几次学习git rebase总是遇到各种各样的问题无疾而终. 今天终于痛下决心结局了教程参看文章https://zhuanlan.zhihu.com/p/139321091https://www.jianshu.com/p/68a55caa4501这里描述下坑我本地通过git log .命令看到的提交历史没有那么多merge branch请求啊, 为什么在gitlab发起merge的时候能看到呢?原因就是你用的是git log .应该用git log应该原创 2021-03-19 10:25:42 · 320 阅读 · 0 评论 -
okhttp学习系列之Route路由
文章目录看完代码觉得有点累, 不想很详细的写了, 看下面的参考文档吧, 写的挺好的一句话概括Route是作用Route就是设置代理时, OkHttp解析Proxy时用的. 如果不设置代理, 系统会默认给一个DefaultRoute, 这个时候就不用关心了https://blog.csdn.net/chunqiuwei/article/details/74079916https://blog.csdn.net/tq08g2z/article/details/77311386...原创 2021-03-17 11:58:11 · 437 阅读 · 0 评论 -
okhttp学习系列之CallServerInterceptor拦截器
这个拦截器是干嘛的前面我们已经通过ConnectInterceptor拦截器建立了连接(参见ConnectInterceptor拦截器), 那CallServerInterceptor就是发起真正的网络请求, 他是最后一个拦截器val interceptors = mutableListOf<Interceptor>()interceptors += client.interceptorsinterceptors += RetryAndFollowUpInterceptor(client原创 2021-03-16 12:09:01 · 342 阅读 · 0 评论 -
okhttp学习系列之interceptor和network interceptor的区别
这两个的区别主要是OkHttp调用的顺序不一样,如下图代码里可以看到val interceptors = mutableListOf<Interceptor>() //先处理interceptor interceptors += client.interceptors //然后添加OkHttp自己的interceptor, 处理Cache, 重定向, 连接复用等 interceptors += RetryAndFollowUpInterceptor(client) interce原创 2021-03-16 10:06:32 · 2836 阅读 · 0 评论 -
okhttp学习系列之ConnectInterceptor拦截器
这个拦截器是干什么的简单讲,这个拦截器是为了建立连接的,连接优先来自连接池里面的可用连接,如果连接池里面没有,那么就新建一个链接。我们前面有提到,RealCall中实际负责发起连接和数据传输的是Exchange,但是到现在为止,Exchange还没有初始化,所以我们要完成Exchange的初始化。但是层层发现,Exchange的初始化,主要关键在于拿到RealConnection核心逻辑简单走读一下代码,就会发现核心的逻辑在ExchangeFinder.findConnect中,这个类里面,主原创 2021-03-11 19:01:47 · 229 阅读 · 0 评论 -
okhttp学习系列之CacheInterceptor拦截器
Cache-Control字段在正式介绍CacheInterceptor拦截器之前,我们有必要复习下Cache-Control字段。因为CacheInterceptor实际上是对Cache-Control字段的逻辑实现常见的取值及含义是no-store 彻底禁用缓存,所有内容都不会被缓存到缓存或临时文件中 no-cache 在浏览器使用缓存前,会往返对比ETag,如果ETag没变,返回304,则使用缓存 public 所有的内容都将被缓存原创 2021-03-08 16:18:41 · 220 阅读 · 0 评论 -
okhttp学习系列之BridgeInterceptor拦截器
概述BridgeInterceptor拦截器,按照官方的注释是/** * Bridges from application code to network code. First it builds a network request from a user * request. Then it proceeds to call the network. Finally it builds a user response from the network * response. */原创 2021-03-08 14:56:15 · 210 阅读 · 0 评论 -
okhttp学习系列之RetryAndFollowUpInterceptor拦截器
参考文档简书上 Okhttp的介绍https://zhuanlan.zhihu.com/p/116777864所有的代码注释已经提交到https://gitee.com/you-zijun/okhttp/commit/db6d553705220faffbfb3e765672bb89254316bb概述RetryAndFollowUpInterceptor是OkHttp的中定义的默认拦截器中的第一个,主要负责进行重试和重定向的处理。 internal fun getResponse原创 2021-03-08 12:09:53 · 497 阅读 · 0 评论 -
Android Camera2学习笔记
直接说Camera2,参看文章(本文章是下面文章的学习笔记,建议直接阅读下面文章)https://www.jianshu.com/p/9a2e66916fcb概览https://www.jianshu.com/p/df3c8683bb90开关https://www.jianshu.com/p/067889611ae7预览https://www.jianshu.com/p/2ae0a737c686拍照概览1. 拍照的流程如下图,Camera2的API模型被设计成一个Pi...原创 2021-02-19 10:05:25 · 488 阅读 · 1 评论 -
Android中的类加载器
参考文章手把手教你实现最简单的插件化框架Android官方源码深入理解Android ClassLoader类的生命周期类的生命周期可以参看下图其中,加载阶段可以细分如下1. 加载类的二进制流2. 数据结构转换,将二进制流所代表的静态存储结构转化方法区的运行时的数据结构3. 生成java.lang.Class对象,作为方法区这个类的各种数据的访问入口加载类的二进制流有以下方法1. 从zip包中读取,这就发展成了我们常见的JAR、AAR依赖2. 运行时动.原创 2021-02-04 11:38:45 · 399 阅读 · 0 评论 -
编码学习之UTF-8
UTF-8,全称是8-bit unicode transformation format,应该是目前最流行的一种编码。UTF-8是一种变长编码,一个字符占用1~6个字节,通常来说,汉字占有3个字节(虽然我没有找到反例,但是不建议直接这么定义“一个汉字=3个字节)UTF-8向下兼容ASCII码编码的方法如下如上图1. 如果第一个字节的第一个bit是0,表示这是一个ASCII码,一个直接就可以了2. 如果第一个直接的前两个bit是11,代表这是一个字符的第一个Byte,然后从左向右,原创 2021-02-01 18:37:58 · 1504 阅读 · 0 评论 -
编码学习之URL 编码(百分号编码)
你肯定发现了,我们在浏览器中的请求,中文都会变成一个“奇怪的”的百分号字符https://www.baidu.com/s?wd=%E6%98%A5%E5%A4%A9%E4%BD%A0%E5%A5%BD&rsv_spt=1&rsv_iqid=0x8cce01c500151159&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_d原创 2021-01-28 15:45:26 · 1863 阅读 · 0 评论 -
编码学习之Base64
Base64编码方式简介我们直接用文本编辑器去打开pdf,exe等,肯定会看到很多乱码,因为并不是所有的二进制字符都可以打印出来。为了能够打印出来所有的二进制数据,就用到了Base64编码。Base64编码中,以每6个bit为一个单元,所以一共可以取64个值,对应64个可打印字符。这样3个Byte就相当于24bit,对应4个Base64单元。例如编码Man,转化为Base64的编码就是文本 M a n ASCII编码 77 97 110 二进制原创 2021-01-28 12:08:44 · 471 阅读 · 0 评论 -
常见的加解密算法【MD5, AES, RSA等】
1. 摘要算法常见的摘要算法主要有两种,MD5和SHA1。摘要算法并不是一种加密算法,因为不可逆,无法从密文还原出明文。摘要算法主要用途有消息完整性验证:发送消息时,将发送数据与MD5值一起发送,然后可以从MD5值来验证接收到的消息是否完整。常见的有下载文件等场景,服务端提供一个文件的下载地址和文件的MD5值,客户端再下载完成后验证文件的MD5,如果与服务端的值不同,说明下载出问题了,需要重新下载。 安全访问认证:如数据库存储登录密码的MD5值,这样就可以保证即使管理员也无法查看到常用密码原创 2021-01-22 17:26:00 · 4225 阅读 · 1 评论 -
Android Kotlin okhttp Retrofit 线程协程那些事
这篇文章不是用来讲概念的, 只是用来谈论一些关于Android 进程\协程那些问题1. android 子线程中的异常会引发crash闪退吗?答案是会的Thread{ throw RuntimeException("this is a error")}.start()异常21741 2379 E AndroidRuntime: java.lang.RuntimeException: this is a error21741 2379 E AndroidRuntime: at com.原创 2021-01-20 16:02:25 · 932 阅读 · 5 评论 -
android http\https学习笔记
参考文档阮一峰的博客:https://www.ruanyifeng.com/blog/2016/08/http.htmlhttps://www.runoob.com/w3cnote/http-vs-https.htmlhttp://www.ruanyifeng.com/blog/2014/02/ssl_tls.htmlhttp://www.ruanyifeng.com/blog/2016/08/migrate-from-http-to-https.htmlhttp的缓存机制https://w原创 2021-01-19 20:37:49 · 240 阅读 · 0 评论 -
优秀文章收集
AndroidGradle 学习教程https://www.jianshu.com/p/e26236943dd6原创 2021-01-18 10:45:46 · 64 阅读 · 0 评论 -
FlexboxLayout练习
一直以来有用FlexboxLayout, 但是没有对属性进行系统的整理, 现在整理下主要参看文档https://juejin.cn/post/6844903697500241928#heading-4https://github.com/google/flexbox-layout引入引入最新版本implementation 'com.google.android:flexbox:2.0.1'默认的布局文件如下<?xml version="1.0" encoding="utf-8".原创 2021-01-05 18:14:45 · 325 阅读 · 2 评论