- 博客(58)
- 收藏
- 关注
原创 「WinddowInsets(二)」我们能用WindowInsets做什么?
WindowInsets我们能用WindowInsets做什么?首先,之前第一篇介绍过WindowInsets,它就是一些「系统视图」。那我要它干嘛,我平时开发都是直接xml中或者compose中直接就开始编写contentView了,根本不关心这什么Insets,爱谁谁。但是当你知道Insets能做的事情,你将会实现更多「牛逼」UI效果了。多牛逼?全屏绘制内容在以前我们绘制全屏内容都需要给Activity设置各种UI的FLAG,以致于UI可以绘制成全屏,然后动态计算一些状态栏的高度等。现在你
2022-01-19 21:32:30
3477
3
原创 「WinddowInsets(一)」什么是WindowInsets
WindowInsets什么是WindowInsetsWindowInsets 是一堆的「系统视图」,有那些是系统视图?例如:状态栏导航栏手势导航等这些「视图」是被应用到了一个Window上的。如下图所示:注意:一般「状态栏」和「导航栏」的组成叫systemBar。好了,这里就介绍了完了什么是WindowInsets,接下来我们介绍它能干什么?...
2022-01-19 21:19:35
1284
原创 协程异常的个人感悟与在Android中的用例
协程的异常机制是非常有意思的,如果协程的异常「传递」机制没有搞懂的话,基本上协程是在瞎写的。而Android里面,有Activity、Fragment相关UI更新在后台状态是不需要更新的。甚至一些网络访问在某些时刻就需要被取消或者「停止」后续操作,其实这里面的停止是带引号的,因为一旦网络请求发送了,那么意味着操作系统已经为其建立了IO的管道,所以作为APP开发者是控制「不到」的,但是由于APP已经处于后台了,那么我们的请求本质不应该再「响应」。所以一般APP处于后台后,请求发送了,就会等待它执行完成,
2021-10-06 21:36:55
183
原创 Android 11+ Window Insets & Edge-to-edge
if (SDK_INT >= 29) { window.setDecorFitsSystemWindowsCompat(false) binding.toolbar.setOnApplyWindowInsetsListener { view, insets -> view.updatePadding(top = insets.systemWindowInsetTopCompat) insets }}Keyborad animation
2021-10-06 21:21:57
769
原创 协程某些场景下需要被取消的最佳实践
Coroutines & Patterns for work that shouldn’t be cancelledhttps://medium.com/androiddevelopers/coroutines-patterns-for-work-that-shouldnt-be-cancelled-e26c40f142ad
2021-07-30 15:16:27
92
原创 协变与逆变
Kotlin协变<out T>,只能作为消费者,只能读取不能添加逆变<in T>,只能作为生产者,只能添加,读取出的值只能当做 Any 类型不变<T>,既可以添加也可以读取Java协变<? extends T>,只能作为消费者,只能读取不能添加逆变<? super T>,只能作为生产者,只能添加,读取出的值只能当做 Object 类型不变<T>,既可以添加也可以读取...
2021-03-09 22:47:52
96
原创 记录Java 线程池读源码流程
线程池运行流程先判断核心线程数;如果核心线程数已经满了或者为0, 则会先尝试offer到提供的BlockQueue里面;当BlockQueue的Offer失败的时候,就会判断非核心线程数(剩余线程),然后尝试直接运行;如果都满了,就会走拒绝策略,默认是直接抛出异常?注意: BlockQueue有很多种实现,有可能一直Offer成功,但是并不意味着Offer成功就能执行,还需要工作数量等于0才行.否则只能做完一个取一个. 而取的时候的函数是先取传进来的command,如果传进的参数comman
2021-03-07 18:36:03
79
原创 The BC provider no longer provides an implementation for Signature.SHA1withRSA.
java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for Signature.SHA1withRSA. Please see https://android-developers.googleblog.com/2018/03/cryptography-chang...
2019-12-02 16:04:56
1744
原创 OKHttp 3.14.X源码架构学习(一)
OKHttp 3.14.X源码架构如何使用OKHttp这里以非Kotlin版本介绍首先在build.gradle中添加组件:implementation 'com.squareup.okhttp3:okhttp:3.14.2'在MainActivity中调用OkHttp的API://注意这里,一般我们用单例,Okhttp官方描述如果不用单例,线程管理等都失效了,浪费开销/*...
2019-11-26 12:20:55
335
原创 Android 9.0双网卡转发到wlan0上网并通过busybox 获取gateway
busybox traceroute -q 1 -m 1 1.0.0.0 | sed -n 2p | cut -b 5- | cut -d ’ ’ -f 1 | awk ‘$1=$1’tb8788p1_64_bsp:/ # busybox traceroute -w 1 -q 1 -m 1 1.0.0.0 | sed -n 2p | cut -b 2-1 192.168.50.1 (192...
2019-11-26 10:45:27
1655
原创 Windows程序多开一般处理
Windows程序多开一般处理一般部分程序为了利益可能会防止你多开,所以我这里介绍一下自己摸索半年学会的一些知识点结合某款市面上现在的游戏进行讲解.我们要实现多开前,一般需要知道如何防止多开.如何防止多开通过文件共享判断文件是否存在,如果存在即为多开.(弊端:可能程序crash导致文件句柄没有得到释放)通过建立Server socket进行IPC通信;通过建立NamedPipe进行I...
2019-11-11 11:26:13
9788
5
原创 当Jenkins遇到Android
Jenkins高级应用什么是Jenkins为什么需要Jenkins新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导...
2019-11-08 11:56:22
300
原创 Android 集成Robolectric下的一些坑
Robolectric的使用的一些坑Robolectric可以非常方便的模拟Android环境进行单元测试,JUnit只能进行java的单元测试,所以对于想要非真机或者模拟器测试便衍生出来了RobolectricGithub:https://github.com/robolectric/robolectric集成方式:添加依赖 :testCompile 'org.robolectric:robole
2017-04-21 11:16:48
3822
原创 Android 仿淘宝京东等我的订单界面及任意列表拓展
概述目前像淘宝及展示列表等都有多个item展示的需求,可能大多数如果没做过,第一眼就是ListView去嵌套ListView,虽然这样是可以完成,但是这样做会导致手机过度绘制,为什么呢?因为当一个Item加载的时候又会去更新item里面的adapter,apapter又会去更新自己的item,这样就会导致加载一条x*n耗时. 解决思路当我遇到这样的问题时候,其实我们可以把整个List,当做一个Li
2016-11-23 11:36:59
27065
31
原创 Android 你了解Android签名文件吗?
签名介绍Android的签名相信大家经常会遇到的,当我们做好一款APP准备发布的时候我们就需要一个realese的key文件给我们这个app签名.那我们没有指定的APK是不是就没有签名呢,?并不是,所有的APK都是有签名的,如果没有指定签名文件,编译时会默认用SDK目录下的debug签名文件.签名文件是什么:其实签名文件就可以看作是一个容器,用来装一些摘要信息的容器而已.签名的作用及重要性Andro
2016-11-14 15:45:44
13605
1
原创 Android Router+RxAnroid+Retrofit2.0+OkHttp+MVP构建项目所需框架
框架开头介绍2016年就快结束了,这一年Android技术不断的发展,比如HotFix,React-Native,RxJava等.也是Android转型的标志吧,从2014年12月份的时候Android Studio才出0.9的beta版本,到现在2.2正式版本,开发中的插件等效率都不断在提高,从最开始的MVC架构到现在的MVP,MVVP等,所以就写了一个”3ROM”框架供大家学习和项目使用.详细介
2016-11-08 14:53:21
5301
原创 Android APK代码混淆与资源混淆详解,你确定不看?
APK的混淆分为资源混淆与代码混淆.一般大部分都使用两者结合.尤其是目前主流的应用. 其中的优点:防止被恶意破解逆向分析减少apk体积,也是瘦身的方法代码可阅读性降低其中的缺点:调试不方便(可以配置mapping变得方便)测试不充分,可能导致部分功能不能使用(比如注解相关等)混淆前(这儿偷个懒直接用工具反编译看):混淆后:如何使用代码混淆:1.直接在build.gradle文件中配置即
2016-09-20 14:37:00
20857
原创 Android 原型设计模式
简介原型模式是一个创建型的模式.原型就是应该有一个样板实例,我们可以从这个样板对象中复制出一个内部属性一致的对象,其实就是一个”克隆”,被复制的实例就是我们所称”原型”,这个原型是可定制的.主要是原型模式多用于创建复杂的或者[构造耗时]的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更加高效.原型模式的定义用原型模式指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式的使用场景一
2016-03-14 20:32:20
3705
1
原创 Android 源码编译的一些感悟
下载篇首先国内下载很吃力的,所以的准备一个vpn,免得受皮肉之苦.主要是aosp.repo其实就是一个Py脚本,下载估计会等过几小时吧,下载的时候文件都是被隐藏的,当你源码下载完毕后源码就自动显示.编译篇为了编译也找了不少的错误.首先你得按照官网的步骤先在Ubuntu上把需要的库都安装了,接下来需要source 一个脚本,该脚本包含了编译一些命令(mmm,mm,m等.).然后就是一个稍微比较难的就是
2016-03-07 22:53:41
447
原创 Android Handler源码分析
Handler用了很久了,也看了很久,东西多了容易忘记一些,所以最近会记录一些源码相关的,防止忘记. :Handler平时我们经常使用,因为大部分都是用来更新UI,其实Handler并不是只能用来更新UI,还有其他的功能,本篇文章主要是分析一下,便于忘记的时候随时来看.主要分析包含MessageLooperMessageQueueHandler初始化消息队列Android 开发是不允许在
2016-03-01 11:15:05
527
原创 Android Studio NDK编译.
1.设置NDK路径.2.添加:android.useDeprecatedNdk=true3.创建Jni,创建native方法.4.javah -d jni -classpath [sdk_src];....\..\build\intermediates\classes\debug [packagename.classname].
2016-01-19 00:33:31
736
原创 Android HLS协议相关记录及部分解析
github:AndroidVideoServer(参考库)Android 底层实现HLS协议的部分解析由于目前网络不好,暂时先记录想到的,因为HLS是最近开始学习研究的,害怕最近项目忙忘记,所以先记录下(以下位于LibStageFright):Android.mkHTTPDownloader.cppHTTPDownloader.hLiveDataSource.cppLiveDataSou
2015-12-29 00:29:09
3417
1
原创 读Android Singleton设计模式实战
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.Singleton 模式的使用场景确保某个类有且只有一个对象场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个,例如,创建一个对象需要消耗的资源过多,如果要访问IO和数据库等资源这时候就要考虑使用单例模式.饿汉模式 package com.softtanck; public class S
2015-12-01 10:13:04
804
原创 读Android Builder设计模式后实战
Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder 模式的使用场景相同的方法,不同的执行顺序,产生不同的事件结果时.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适.当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时
2015-11-30 15:08:55
677
1
原创 Git 删除远程仓库文件
使用 git rm 命令即可,有两种选择. 一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除; 一种是 git rm --f "文件路径",不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶) 假如你有文件不小心commit到了服务器那么你想要删除它,可以使用:git rm -- cach
2015-11-26 11:19:16
20341
2
转载 Android冷启动时间优化
冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局 冷启动时间优化 知道了Android冷启动时间的原理之后,就可以通过一些小技巧来对冷启动
2015-11-23 10:33:01
844
原创 Android 中即时聊天或者后台任务需要发送消息的一种解决方案.
在即时聊天中可能会存在一个隐藏的Bug,这个Bug根据手机的网速和性能有关系,比如你即时聊天中,你发送一消息,你的网络情况不是很好,这个时候你发送的消息一直处于发送状态,然后你不想看了,就按退出,这个时候Activity或者Fragment被销毁的时候就导致了这个消息被强行GC了,所以为了解决这个方案,我们可以使用IntentService,什么是IntentService?/*IntentS
2015-11-17 16:32:21
3388
原创 Android 调用系统拍照及相册裁剪后作为头像,兼容到5.0
上周做了一个头像主要是为了抽出来封装一下,因为99%的应用都需要个人头像的上进行裁剪然后作为头像.所以考虑到这部分的需求,所以要解耦,为了代码的阅读性,扩展性等. 大家都知道调用系统相机和相册都会运用OnActivityResult方法来获取操作和数据.那么需要对这个函数进行良好的编码. 首先启动一个Activity需要调用ActivityForResult然后Reques
2015-11-16 15:19:17
3076
1
原创 Android 即时聊天布局解析
聊天布局的设计其实有讲究的,如果你写的好,那么你在适配器中的代码就可以少写,如果你的布局没写好,那么你的适配器的逻辑将会非常复杂. 写布局有几个要素: 1.命名.如果控件功能一样,那么把名字命名一样. 2.控件个数.除了发送消息的控件多于接受. 按照这两种就可以实现自己定义的布局,这样适配器可以少写很多逻辑,其中需要用的一些.9.png的技术,读者可以自行学
2015-11-09 11:10:59
3160
原创 Android使用Glide加载Gif.解决Glide加载Gif非常慢问题
在Glide文档中找了半天没发现加载Gif的方式.然后通过基本的用法去加载:Glide.with(MainActivity.this).load(url).asGif().into(imageView); 发现网络也没有获取,翻了一连接才找到:https://groups.google.com/forum/#!msg/glidelibrary/fZnIK2IW7cQ/lnBWNMsklI
2015-11-05 17:16:12
49728
11
翻译 Android RxJava使用方式及说明.
什么是ReactiveX? ReactiveX是一个API,它主要关注的是异步的组成和操作可以观察到的数据流或者事件通过使用观察者模式,迭代器模式,函数式编程的特点。处理实时数据是一种常见的发生和拥有一个高效、清洁、可扩展的方法来处理这些场景是很重要的。ReactiveX提供了一个可组合和灵活的API来创建和数据流动作,同时简化异步编程的正常问题线程创建和并发问题。RxJava的简介
2015-11-02 15:19:31
834
原创 Anroid之即时聊天的布局及适配器的编写.
即时聊天控件一般采用ListView,因为ListView可以支持不同类型的item,同时ListView本身自己维护了复用机制,可以避免大量的item重复创建导致OOM,但是由于ListView复用机制所以对于编写适配器就需要避免界面混乱,在第一次做布局的时候,一个播放语音动画就导致了布局了混乱显示,所以要编写一个好的apdater去深入了解复用机制去避免界面混乱. 首先我们需要创建一
2015-10-29 11:31:59
1416
原创 Android View的事件分发机制
所谓点击事件的事件分发,其实就是对MotionEvent实践的分发过程,即当一个MotionEvent产生了以后,系统需要把这个时间传递给一个具体的VIew,而这个传递的过程就是分发的过程.点击事件的分发过程由三个很重要的方法来共同完成的,分为:dispatchTouchEvent.onInterceptTouchEvent.onTouchEvent.public boolean dispat
2015-10-29 11:08:27
965
原创 Android之记录几个Uri的Intent.
1,调web浏览器 Uri myBlogUri = Uri.parse(" http://xxxxx.com "); returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri); 2,地图 Uri mapUri = Uri.parse("geo:38.899533,-77.036476"); returnIt = new Inten
2015-10-28 10:31:15
743
原创 Android即时聊天自己封装的QQ录音帮助类.
在做这个录音的时候测试了很多,发现市面上一些IM确实也存在一些问题,最多的问题还是快速点击这个bug.如果频繁的快速点击会导致MediaRecord频繁的创建对导致内存来不及回收而内存泄露.为了屏蔽这个所以必须要在点击的时候进行判断是否为快速点击等,所以效果类似于QQ那样,当你触摸后并不是立即录音,这个时候需要通过一个线程去创建MediaRecord对象.等待对象创建完毕后,播放一个提示音乐,表示
2015-10-23 15:20:02
1902
原创 Android缓存之磁盘缓存.对DiskLruCache进行封装便于存取.
在DiskLruCache中相对于LruCache是非常不方便利于存取的,它的API稍微有一些复杂.它需要一个Editor去Commit,类似于Hibernate对象持久化一样,一般存储都是OutputStrem,所以我们必须要将要存储的数据转为OutputStream.所以为了开放方便便封装了一下存取. 类有:DiskLruCache,DiskLruCacheHelper,Utils.
2015-10-23 14:25:35
2184
原创 Android之打造自己加载高清大图及瀑布流框架.解决错位等问题.
首先看效果图如下: 本框架支持本地图片和网络图片的获取.采用LruCache算法,最少使用的最先释放.有效的避免OOM,项目结构图: 核心加载类在于ImageLoader.采用了TreadPool去做并发请求.UI处理采用Handler去管理,实现的思路类似于AsnycTask类.该类采用单例模式: public static ImageLoa
2015-10-21 10:52:12
11801
3
原创 Android水滴,小球粘性控件生成.
前几天学了Python相关的知识,然后昨天看了一下Skype的Loading非常好看,就想要自己做一个看看.然后网上搜集了一些资料. 需要用bezier去画圆.画了圆后慢慢的拓展右边的点的位置逐渐形成了圆角.效果图: 需要四次贝塞尔画一个圆,用贝塞尔画圆需要一个因子.该因子决定了圆的程度,根据公式可以知道圆的因子:0.551915024494f用该因子 * 半径 可以得到贝塞
2015-10-13 15:42:01
4632
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人