自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

柚子君的博客

写下来,才是自己的

  • 博客(88)
  • 收藏
  • 关注

原创 ConstraintLayout源码

国内太难看源码了, 直接把Google的源码贴过来.

2023-01-11 17:00:35 344 1

原创 自定义Kotlin协程调度器

从上述例子中,我们可以看到系统预置的Default调度器是怎么执行的,我们可以仿照Default调度器来实现自己的调度器。比如说有以下场景,我希望我的任务都在子线程中顺序执行,那我们可以定义一个线程数为1的调度器,如下。我们定义一个线程池,实现调度器中的dispatch方法,直接在单线程池中执行即可。或者我们参考Default实现,规定最大线程数即可。使用办法如下。...

2022-08-13 16:09:57 1241

原创 在安卓手机上搭建一台微型服务器

相信很多人手上都有一些闲置的手机,那可不可以在这些手机上搭建一个服务器呢?下面我们分享一种搭建简易服务器的思路。ROOT并非必须,但是ROOT后我们可以更方面的进行保活等操作,各个品牌的手机root方法不尽相同,下面简单介绍下小米手机的一种ROOT办法。(注意,手机Root后会变的不再安全,非专业人士不要操作)因为后续需要输入recovery镜像,所以我们需要首先解锁bootloader锁。直接在小米的官网上申请就行,按照操作提示一步一步操作就好这里我们选择刷入第三方的recovery工具,可以在下方找到

2022-06-29 19:35:42 12223

原创 RxJava线程调度浅析

一、结论本身不从头介绍RxJava的用法,仅对RxJava的线程调度做出一点解说,为了节约阅读时间,先把本文得到的几条结论写到前面在不指定线程的情况下,RxJava遵循线程不变的原则,即:在哪个线程调用subscribe,就在哪个线程消费;在哪个线程生产事件,就在哪个线程消费事件;observeOn可以调用多次,每次调用影响它直接的下级Subscriber;但是subscribeOn只能调用一次;Schedulers.newThread每次都会创建一个新的线程来执行任务。Schedulers.i

2022-06-01 20:23:29 1038

原创 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 666

原创 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 3432

原创 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 4431

原创 Android findViewById及替代方案大全

自打学习Android开发以来,findViewById就是我使用最频繁的函数之一。findViewById可为灵活至极,但是又让人爱恨交加。那findViewById究竟有哪些优缺点,他又有哪些替代方案呢?今天就来做一个总结findViewByIdfindViewById的原理findViewById的原理非常简单,我们都知道Android中的View结构是一个树形结构,findViewById就是自树的根节点,依次遍历其子节点,知道找到目标的id。findViewById的优点还是先夸夸fi

2022-03-06 11:51:44 11640 2

原创 Android默认gradle配置

sssplugins { id 'com.android.application' id 'kotlin-android'}android { compileSdk 30 defaultConfig { applicationId "com.cmri.myapplication" minSdk 21 targetSdk 30 versionCode 1 versionName "1.0"

2022-02-07 19:32:56 668

原创 Android WIFI认证方式

在Android中,我们如果想知道周围的WIFI热点,以及这些认证方式怎么办?答案是我们可以用WifiManager.getScanResults来获取当前扫描出的热点用ScanResult.capabilities来获取认证方式等。看代码 private fun getCurrentWifi() { mScanResult.clear() //获取当前扫描出的热点 val scanResult = wifiManager.scanResults

2022-02-03 15:32:23 4134 1

原创 匿名内部类持有外部类的引用会导致内存泄漏?Kotlin:没有那么简单

1. 结论做Android的,或者做Java开发的同学,通常都会听到一句话,内部类持有外部类的引用,可能会导致父类内存泄漏?知道大家很忙,那就先把结论抛出来Java中内部类会持有外部类的引用,可能引发内存泄漏Kotlin存在编译优化,会将内部类编译成普通的类,如果内部类中没有实际引用外部类,则不会造成内存泄漏;如果内部类中引用了外部类,则会将外部类的作为参数传递给“内部类”,进而可能引发内存泄漏。Kotlin协程中,GlobalScope与上条相同,如果协程内部没有实际引用外部类,则不会造成内存

2021-11-03 10:11:32 4307

原创 什么是核心网?为何这么难

原文链接 https://www.eefocus.com/communication/419759大家好,今天来说说核心网。核心网的英文叫Core Network(核心网络),简称CN,嗯,没错,就和我们伟大祖国的英文简称是一样的。关于核心网的定义,大家前往不要去看百度百科,里面的说法要么是废话,说了等于没说,要么不是人话,完全看不懂。那究竟应该怎么定义呢?说实话,迄今为止,我没有见过任何一个能让人满意的回答。不是我故弄玄虚,而是这个概念真的很难定义——如果从广义的角度来解释,很难划定边界.

2021-10-15 16:14:54 7508 2

原创 Python中的__init__和__new__

一、__init__方法是什么使用python写过面向对象代码的同学,可能对init方法已经非常熟悉了,init方法通常用在初始化一个类实例的时候。例如:class Person(object): def __init__(self, name, age): print('__init__ called') self.name = name self.age = age def __str__(self): return

2021-10-10 20:47:28 606

原创 了解CoAP协议

物联网产品开发中,我们常常听到各种协议名称,如CoAP,MQTT等,但这些协议究竟如何去传输数据,如何下发指令呢?1. CoAP协议概述1.1 CoAP协议的产生物联网的初衷之一就是通过大数据的采集分析去颠覆交通、运输、物流、能源等生产生活的每个方面。一般而言,物联网遇到的最大问题就是环境的不稳定性,例如没有稳定的电源。除此之外,无线网络的带宽、时延、丢包等问题都比较突出1.2 CoAP协议的定义CoAP是受限制的应用协议(Costrained Application Protocal)。对于那些

2021-10-08 15:07:45 19535 8

原创 EventBus学习

概述EventBus概念GitHub地址基本用法一些不常用的用法走读源码可以学习到什么

2021-06-15 10:53:58 226

原创 RxJava学习笔记

基础用法 compositeDisposable = new CompositeDisposable(); List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("ni"); list.add("hao"); Disposable disposable

2021-05-31 20:01:43 265

原创 Java并发容器CopyOnWriteArrayList

CopyOnWrite,简称COW,是一种程序设计中的优化策略。基本的实现思路是,从一开始大家都共享同一个内存区域,当有人修改时,才会把内存Copy出去形成一个新的内存区域,然后在新的内存区域上修改,它是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,他们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。什么是CopyOnWriteCopy

2021-05-19 10:36:14 183

原创 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 2262 2

原创 Kotlin lambda表达式中的.()

今天看到一种新的lambda写法,里面使用了.(), 直接看下面的例子吧class MainActivity : ComponentActivity() { val repeatFun: String.(Int) -> String = { this.repeat(it) } val repeatFunV2: (String, Int) -> String = { str, times -> str.repeat(times) } override fun

2021-04-26 14:57:49 775

原创 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 4534 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 7778 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 214

原创 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 173

原创 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 1466

原创 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 2502

原创 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 113

原创 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

原创 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 727

原创 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 783 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 139

原创 OkHttp学习系列之Retrofit

Retrofit严格意义上不是OkHttp的,但是这两个东西联系太紧密了,在Android开发商,经常会把Retrofit和OkHttp混到一起用,很方便!! 所以不得不讲一下Retrofit注意下,这篇文章是讲原理的,不是讲用法的,想学习Retrofit怎么用,不要看这篇文章,纯属浪费时间深入到Retrofit的源码中可以看到,Retrofit的设计是非常精巧的,他利用了动态代理和注解技术,用几个类搭建了一个可扩展性非常好的框架,实在是我辈的楷模。Retrofit的逻辑分成以下三个部分创建代理对

2021-03-25 20:38:51 210

原创 docker学习笔记

本篇为学习笔记, 流水记账没有逻辑, 只给自己看, 所以你就不要浪费时间了正文docker命令格式是docker run [容器名] 程序路径 程序参数docker run -i -t ubuntu:15.10 /bin/bash其中 -i表示允许交互 -t表示打开一个终端. 少一个都不行docker ps 表示查看有没有在运行的容器docker run -d ubuntu:15.10 /bin/sh “xxxx”其中-d表示在后台运行docker stop [容器id

2021-03-22 15:21:34 105

原创 我终于学会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 317

原创 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 435

原创 okhttp学习系列之CallServerInterceptor拦截器

这个拦截器是干嘛的前面我们已经通过ConnectInterceptor拦截器建立了连接(参见ConnectInterceptor拦截器), 那CallServerInterceptor就是发起真正的网络请求, 他是最后一个拦截器val interceptors = mutableListOf<Interceptor>()interceptors += client.interceptorsinterceptors += RetryAndFollowUpInterceptor(client

2021-03-16 12:09:01 334

原创 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 2816

原创 okhttp学习系列之ConnectInterceptor拦截器

这个拦截器是干什么的简单讲,这个拦截器是为了建立连接的,连接优先来自连接池里面的可用连接,如果连接池里面没有,那么就新建一个链接。我们前面有提到,RealCall中实际负责发起连接和数据传输的是Exchange,但是到现在为止,Exchange还没有初始化,所以我们要完成Exchange的初始化。但是层层发现,Exchange的初始化,主要关键在于拿到RealConnection核心逻辑简单走读一下代码,就会发现核心的逻辑在ExchangeFinder.findConnect中,这个类里面,主

2021-03-11 19:01:47 226

原创 okhttp学习系列之CacheInterceptor拦截器

Cache-Control字段在正式介绍CacheInterceptor拦截器之前,我们有必要复习下Cache-Control字段。因为CacheInterceptor实际上是对Cache-Control字段的逻辑实现常见的取值及含义是no-store 彻底禁用缓存,所有内容都不会被缓存到缓存或临时文件中 no-cache 在浏览器使用缓存前,会往返对比ETag,如果ETag没变,返回304,则使用缓存 public 所有的内容都将被缓存

2021-03-08 16:18:41 215

原创 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 207

原创 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 492

空空如也

空空如也

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

TA关注的人

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