自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

孙先森的博客

将年岁渐增视为不断积累各种东西的过程

  • 博客(103)
  • 资源 (3)
  • 收藏
  • 关注

原创 博客搬家...

博客搬家,去掘金继续写博客了。

2022-12-23 12:01:02 247 1

原创 Android 启动优化系列 —— 系统启动流程

Android 启动优化系列第一篇——系统启动流程

2022-08-09 22:15:00 1082

原创 Android View绘制流程源码浅析(从源码角度理解为什么子线程不能更新 UI)

一文让你从源码角度彻底理解为什么不能从子线程更新 UI

2022-07-08 22:45:00 809 1

原创 Android 从Java线程到Handler机制源码分析

从 Java 线程、锁机制引出 Android 线程、HandlerThread,再到 Handler 机制、同步屏障机制分析,一文明白其中的原理。

2022-06-25 23:46:00 685

原创 Android okhttp源码调用流程分析

okhttp 是一套专门为 JVM、Android 设计的 HTTP 客户端,支持同步阻塞调用和带有回调的异步调用,可以非常简单的在 Android 项目中实现网络请求。那么 okhttp 到底是如何做到异步请求?如何实现 HTTP 协议的?本文将通过简单案例对 okhttp 的主要源码进行解读。

2022-05-27 18:30:19 327

原创 Android 文字绘制

Android 文字绘制的一些常见问题:文字单位、文字基线、文字居中、文字贴边对齐、多行绘制、图文混排。

2022-05-26 21:07:04 1267

原创 利用 Docker 搭建 WordPress 平台(仅需五分钟即可搭建属于自己的博客网站)

利用 Docker 搭建 WordPress 博客平台,仅需五分钟即可完成搭建过程,拥有属于自己的博客!

2022-05-19 15:10:18 2267 2

原创 Android Retrofit 源码流程分析(Retrofit 2.9.x 最新版本 附详细流程图)

Android Retrofit源码分析 调用流程 Retrofit如何封装OkHttp的 Retrofit线程切换实现原理

2022-05-10 18:29:00 1217 1

原创 浅谈 Android MVVM 需要用 Flow 代替 LiveData 吗?

个人认为当前项目的架构正在使用 LiveData 并不需要完全用 Flow 代替,部分 LiveData 无法完美解决的场景,亦或是当 Flow 能有效解决实际开发中的问题时,可以接入 Flow 来更好的完

2022-04-23 11:52:11 1708 5

原创 Android ffmpeg入门(1)—— 使用NDK交叉编译ffmpeg集成到Android项目

使用NDK交叉编译ffmpeg静态库,并集成到Android项目实现JNI互调。

2022-03-09 11:58:41 7141 4

原创 PostgreSQL 随机n个商品的价格不超过m

select t.* from ( select "id", "price" from "prod" order by random() limit n) as tgroup by t."id", t."price"having sum("price") < m;

2021-12-10 18:05:41 426

原创 PgSql (pgAdmin)启动时报Python文件的错误

报错原图没留下来 复制错误日志用来搜索 最后找到了解决该错误的办法 记录一下创建:pg安装目录/pgAdmin 4/venv/Lib/site-packages/backports/init.pyinit.py 内容为空 创建完成后 删除C:\Users\xxx\AppData\Roaming\pgadmin 目录删除后以管理员身份运行 即可...

2021-04-20 11:04:46 509 7

原创 Express + Nginx 部署Vue实现多路由跳转

场景如下:在 App客户端内有两种H5独立界面 商城 和 推荐界面,正常来说两个页面有两种路由 http://127.0.0.1/shop 和 http://127.0.0.1/recommend;但是Vue是单页面应用,如果直接将打包好的dist文件扔到服务器用Nginx指向对应目录的index.html的话,那就只能有一个入口;为了解决这种情况,搜集了下其他博客以及向同事讨教,记录下利用Express当作http服务器的解决思路;服务器环境配置以windows为例(最好还是linux)先安装需要的环

2020-11-10 15:34:44 1919

原创 Vue创建项目

最近接触了下前端vue开发,记录下一些基本操作,如何创建一个vue项目。环境配置环境需要:Node JS 下载地址WebStorm (编译器 根据个人习惯选择)首先安装Node JS,需要配置环境变量,比较简单就不多说了;安装完成后输入node -v 验证是否配置成功;node -v接着输入npm install npm -g 安装包管理器npm install npm -g安装完成后输入 npm -v 来验证是否安装成功;下面接着通过npm 安装 vue 相关工具,安装打包

2020-11-09 15:36:00 179

原创 Android进阶学习(12)-- 图片加载性能优化(1)

图片加载性能优化前言Bitmap前言最近自己做了一个app,列表中有大量图片需要加载,毫无任何处理的情况下占用的内存可达250M之上: 所以需要对所有的图片进行优化处理,那么优化主要有以下两个方面:图片加载时优化图片的缓存Bitmap要优化图片,肯定是对大图加载时压缩显示,对图像进行处理就需要利用Bitmap位图;Bitmap是...

2020-05-10 15:03:19 793

原创 Android进阶学习(11)-- ViewPager嵌套Fragment懒加载处理

ViewPager嵌套Fragment懒加载处理需要懒加载的情况分析完整代码需要懒加载的情况分析你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。完整代码public abstract class LazyFragment extends Fragment { ...

2020-05-10 14:57:04 605

原创 Android进阶学习(10)-- JNI使用(Java 与 C/C++ 互相访问、调用)

JNI 静态注册、动态注册Java相关命令静态注册实现过程动态注册代码实现Java相关命令 javac xxx.java //生成 .class 文件 javah xxx.xxx(全类名) //生成 .h 头文件 javac -h . xxx.java //Java1.8 以上 代替上面两个命令 生成 .class .h 文件 javap -s -p xxx.java //查看类中的字...

2020-03-26 11:50:37 620

原创 Android进阶学习(9)-- RecyclerView回收、复用源码浅析

RecyclerView复用、回收源码浅析前言RecyclerView中的容器回收源码流程复用源码流程总结前言RecyclerView,可以理解为是谷歌工程师写的一个自定义View开源给我们用,相比于ListView我个人感觉最大的优点在于代码模块化,RecyclerView源码中的封装的非常到位,将各个功能模块化、解耦,阅读源码、使用起来都更加容易;RecyclerView当然也存在缺点,使...

2020-02-29 17:30:40 655

原创 Android进阶学习(8)-- View事件分发、滑动冲突

View事件分发、滑动冲突view事件分发事件分发、拦截、消费单击事件源码分析滑动冲突View事件分发整体流程事件冲突源码分析事件冲突解决办法view事件分发事件分发、拦截、消费在我们的代码中,事件是由 dispatchTouchEvent 负责分发,由 onInterceptTouchEvent 决定是否拦截,最后由 onTouchEvent 消费;单击事件源码分析button.se...

2020-02-27 17:54:54 249

原创 Android进阶学习(7)-- AIDL

Android AIDLAIDL是什么AIDL使用AIDL流程分析AIDL是什么AIDL(Interface definition language)是Android中IPC进程间通信的一种实现方式,通俗的来说,一个APP可以通过另一个APP提供的Service进行交互。AIDL使用创建两个APP项目,一个作为客户端client,一个作为服务端,实现以下功能:1.客户端向服务端提交数据...

2020-02-22 20:15:57 378

原创 Android进阶学习(6)-- Dagger2

Dagger2依赖注入依赖依赖倒置控制反转(IOC)依赖注入Dagger2Dagger2 是什么Dagger2入门依赖注入依赖依赖倒置软件设计六大原则之一,简称DIP;控制反转(IOC)依赖注入Dagger2Dagger2 是什么可以理解为是实现依赖注入的一种工具Dagger2入门@Inject 1. 标记注解元素 2. 标记构造方法@Module...

2020-02-21 19:29:58 262

原创 Android进阶学习(5)-- APT 手写ButterKnief

Dagger2注解基础注解的定义元注解注解属性注解的提取注解与APT注解基础注解的定义自定义注解非常简单,和定义接口很像,只需要在interface前面加一个@即可public @interface AutoTest {}@AutoTestpublic class MainActivity extends AppCompatActivity{ //do somethings}...

2020-02-19 17:58:29 188

原创 Android进阶学习(4)-- RxJava 从源码角度学习理解

RxJavaRxJava基础观察者模式装饰者模式背压RxJava的 "冷" 与 "热"RxJava操作符RxJava线程切换RxJava源码浅析RxJava基础在学习RxJava时,我们需要先了解一些基础概念。目前RxJava1.x基本都不在使用,博客内容都以RxJava2.x进行总结。观察者模式观察者模式,是RxJava的核心思想,首先我们装饰者模式背压RxJava的 “冷” 与 ...

2020-02-17 18:00:46 250

原创 Android进阶学习(3)-- Android多线程、线程池原理与AsyncTask

Android多线程、线程池原理与AsyncTaskCPU、进程、线程1.CPU核心数和线程数的关系2.CPU时间片轮转机制3.进程和线程并行和并发Android 启动线程1.Thread2.Runnable3.Callablerun() 和 start()的区别Android 关闭线程关闭线程的方法Runnable关闭线程join() 和 yield()线程间的共享和协作synchronized...

2020-02-16 12:08:26 519

原创 Android进阶学习(2)-- 反射及动态代理模式

反射及动态代理模式什么是反射Class类获取Class类通过反射获取构造方法通过反射获取方法通过反射获取属性静态代理模式动态代理什么是反射“反射”之中包含了一个“反”字,我们先来看看什么是“正”;一般情况下,我们使用某个类会知道他是干什么的,里面有哪些属性和方法,在使用时对这个类实例化,之后用实例化的对象来操作。反射,则是一开始我们不知道要使用的类是什么,所以不能使用new关键字来实例化,更...

2020-02-14 20:27:36 471

原创 Android进阶学习(1)-- Java泛型

Java泛型为什么需要泛型泛型类的定义(类、接口)1. 泛型类的定义2. 泛型接口的定义泛型方法辨析,限定类型变量1. 泛型方法的辨析2.限定类型变量泛型中的约束和局限性1.不能实例化类型变量2.静态域或者静态方法不能引用类型变量,静态方法本身是泛型方法则可以使用3.泛型类型不可以是基本类型,必须使用包装类型4.不可以使用 instanceof 关键字5.不能创建参数化类型的数组6.不能继承Exc...

2020-02-14 14:46:18 225

原创 Android RadioButton修改圆圈大小

修改radioButton选择圆圈大小,找两个图片(选中,未选中),通过给radiobutton控件设置button属性,设置为selector属性,selector中引用两个layer-list资源文件,在layer-list中可以设置大小效果图:代码如下:radio_button_green_check<?xml version="1.0" encoding="utf-8"?...

2019-12-31 15:20:36 6502 1

原创 MvRx + Epoxy —— 简单封装/数据传递/监听

上一篇博客写了《MvRx的基本使用》,简单介绍了以下MvRx的优缺点和基本使用。这篇博客主要分享下MvRx的一些简单使用技巧。文章目录简单封装数据传递监听博客中的项目地址:https://github.com/RDSunhy/MvRxSample简单封装根据官方的WiKi先封装一些基类,方便后面的使用,首先封装的就是ViewModel,代码如下:BaseViewModelabstra...

2019-12-27 10:03:28 980

原创 Android 沉浸式状态栏适配(兼容多机型)

适配状态栏百度千篇一律的判断机型,由于在RN开发时设置状态栏也就一句代码的事,我翻了以下android的文档,分享一下我在项目中如何适配状态栏状态栏适配,实则是完成以下操作:1.状态栏透明,布局直接从屏幕顶部开始,布局顶部加padding即可2.状态栏背景白色时,字体变成黑色,反之则设为白色3.android6.0之前不提供修改状态栏字体颜色的方法,所以我采用给它设一个半透明黑色背景,突显...

2019-12-26 09:47:49 1766 2

原创 MvRx + Epoxy —— 基本使用

最近开发项目的时候框架选择了MvRx,一个更适用于单Activity多Fragment应用的框架,熟悉React - Native开发的会很容易入手这个框架,思想基本是一样的。项目忙碌的过程已经过去了,现在我会抽时间写写使用MvRx的总结,分享在博客上,国内的MvRx教程确实非常少,不过github上的Wiki写的也很详细,认真读几遍会解决很多问题。

2019-12-16 10:03:45 3613 4

原创 Android 打开系统文件管理器选择文件

记录一下打开手机文件管理器选择文件的实现代码: //定义 请求返回码 public static final int IMPORT_REQUEST_CODE=10005; public void openFileManager(){ Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*...

2019-11-08 17:52:59 6333 1

原创 React Native 实现列表模糊搜索(FlatList模糊搜索)

记录一下本地实现列表模糊搜索,效果图:实现思路:利用TextInput的onChangeText方法,当输入框文字改变时立即去调用自己写的数据筛选方法,修改Flatlist的data(data应该是定义在state中)。列表数据最好用map循环给每一条数据增加一个新的字段(此处用hidden解释)控制item是否显示。搜索方法中判断输入框传过来的关键字,长度大于0时,用map循环data,不...

2019-11-04 17:14:37 2385 1

原创 Android 自定义view中接受广播刷新数据

在写自定义view时遇到需要刷新数据时,可以利用接受广播来改变数据,那么在自定义view中如何接受广播?自定义view中给我们提供了两个函数,分别是onAttachedToWindow和onDetachedFromWindow;通过测试发现他们的执行顺序是onAttachedToWindow、onDraw、onDetachedFromWindow;所以我们在onAttachedToWindow中...

2019-10-17 16:55:29 843

原创 You cannot start a load for a destroyed activity

这个错误是我在使用Glide加载图片时,频繁打开关闭activity时会出现的异常。解决办法:把context改为Application的context。//自定义Applicationpublic class App extends Application { private static App mApp; public void onCreate() { ...

2019-10-16 10:10:55 2921 1

原创 Android 获取网络视频某一帧图片

获取网络视频的某一帧作为封面图,可以使用Glide实现,但是效果不是很好,主要问题就是加载慢,有几秒的延迟。这里利用Android提供的MediaMetadataRetriever类来获取。MediaMetadataRetriever主要是对网络、本地媒体文件做操作。获取某一帧代码如下:MediaMetadataRetriever retriever = new MediaMetadataRe...

2019-10-14 13:08:53 4504 1

原创 Parcelable encountered IOException writing serializable object (name = XXX)

记录一下遇到的bug问题、原因:Parcelable encountered IOException writing serializable object (name = XXX)我遇到这个问题的原因在于,利用intent传递bundle是的实体类中的内部类没有全部实现Serializable接口。 实体类中的每一个内部类都需要实现Serializale接口...

2019-10-12 09:12:28 2922

原创 Android view不同状态下切换不同背景

一般是通过设置background为drawable资源实现不同状态不同背景。代码如下:<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:stat...

2019-10-12 09:03:53 898

原创 Android 验证码按钮

效果图:实现思路,利用 CountDownTimer 倒计时工具类,指定间隔修改button显示文字以及是否可以点击,代码如下://下面代码直接写在onclick事件中CountDownTimer timer = new CountDownTimer(60000, 1000) {//参数为 (倒计时长,间隔) @Override ...

2019-10-09 13:19:36 487

原创 Android 指定item滑动到可见区域第一个位置

将列表滑动到某个item一般都使用scrollToPosition()方法,但是这个方法有个弊端,只要传入的item索引是当前可见的不管它的位置在头部尾部还是中间就不会滑动。效果图:我遇到的需求是需要将指定item滑动到可见区域的第一个位置,解决办法如下:LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller...

2019-10-08 17:03:29 943 1

原创 Android饺子播放器自定义

最近做了下视频播放功能,基于饺子播放器对其UI进行了修改,期间也遇到一些bug,记录一下。引入我使用的是6.4.2版本,7.0版本之后的源码有一些变化,不过大同小异;将github上源码下载下来,以import module的方式将源码中的jiaozivideoplayer引入。切换播放源我使用的是ijkplay,首先添加需要的依赖和一些.so文件 //ijk播放内核 imple...

2019-09-27 09:26:08 4247 6

jniLibs.zip

饺子播放器切换ijkplayer时需要的so文件。下载下来之后把文件夹放在java同级目录

2019-09-27

Zxing源码(3.3.4最新)

github上zxing的源码,github下载速度慢特意分享在此,集成教程我写在博客

2019-04-09

Android开发艺术探索(基于Android5.0)

Android开发艺术探索(Android5.0 有目录),非常适合进阶的书籍,讲解了很多原理性的知识,对于已经入门的开发者提高非常大的书籍。

2019-02-20

空空如也

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

TA关注的人

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