自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(118)
  • 收藏
  • 关注

原创 Android 技巧之巧用Range注解(IntRange,FloatRange) 和自定义Range

在我们Android开发应用程式时,会经常写一些自定义的公共方法或者工具类比如弹框的时候,将Activity背景设置暗一些,弹框消失,恢复到原状,比如自定义View时,Color的区间取值示例Code: fun alpUpdate(context: Activity,bgAlpha: Float) { val lp = context.window.attributes lp.alpha = bgAlpha //0.0-1.0 cont...

2021-03-31 10:03:29 2688 2

原创 Java/Android 使用 UncaughtExceptionHandler 捕获未知的Exception

在Java or Android 开发中,会接触到各种Exception 先看一下分支结构:顶级Throwable:然后细分为Error(无法处理) 和Exception(可以处理)的分支接触到最多的异常安装频率来说有这么几种:NullPorinterException 空指针 访问的对象或者方法等为NullArrayIndexOutOfBoundsException 数组角标越界 比如size = 5 ,ge...

2020-07-28 10:45:33 753 2

原创 使用Objects.requireNonNull判断一个对象是否为空吧

如果当前对象为空 会抛出一个空指针异常否则就会返回当前对象

2018-11-26 14:54:15 31711 11

原创 Android Gson 将json数据转double 数值为0.0的问题

今天上午改需求 遇到一个奇葩的Bug 返回的为double 类型 于是在实体类里写private double space; get  set略。。。但是显示的时候为0.0  于是将实体类的double 改为String  于是...就显示0了阿西吧 什么鬼通过Debug  分析下解析的这块 知道需要装箱操作 于是改为 Double  Bug 顺利解决以...

2018-08-23 10:16:01 2822 5

原创 android recyclerview 上下滑动导致点击事件和数据错乱问题解决

今天遇到一个奇怪的Bug 上下滑动Item时候 再往上滑 拨打电话 与刚开始不一致,网上很多人说setTag种种,但并没有什么卵用,很鄙视那些复制粘贴的两种解决方案getItemViewType(int position){return position} // 这样多种布局应该不方便在onBidViewHoudle中,添加点击事件的position 不要中onBidViewHoud...

2018-07-13 14:20:39 4098 5

原创 RxJava

实现了Disable,继承了AtomicRefrence 线程安全的引用,可取消,线程安全,同样也是一个Runnable。订阅,RxJavaPlugins.onSubscribe 钩子方法,产生订阅和过滤。没有延时的Single则不再产生消息,然后不再计算,其他的则通过内部挂接进行操作。订阅和执行成功回调,disposed 表示丢弃,顺时完成,一产生订阅就执行成功。取消事件则是停止上游产生消息断开上游的联系,判断是否是新创建的还是生成的。如果进行dispose,则用内部传入的值进行dispose。

2023-12-02 23:33:53 470

原创 Java 线程同步和通信

进程是操作系统的独立区域,各个区域互不干扰,一个进程可以有多条线程同时工作,进程大于线程,线程依赖进程,线程间可以共享资源。第一个参数是线程池数量,以及上限,第二组则是等待时间和单位。Android 11 废弃了AsyncTask。native方法 通过虚拟机跟操作系统交互。优点是可重用性较高,一般推荐使用线程池。有执行的任务.会等执行完再关闭。接口,通过Thread开启。通过start 开启。

2023-12-02 11:05:56 446

原创 Constraintlayout

goneMargin 约束的View隐藏时的margin。Group 指定一系列View进行绑定进行操作。约束链风格 chainStyle。然后通过group进行操作。GuideLine 基线。然后setIds进行绑定。

2023-11-30 23:57:15 576

原创 View绘制

Activity的OnCreate在ActivityThread中的 - handleCreateActivity , onStart ,onResume 也是在类似的方法调用。当自定义的ViewGroup是个滑动控件,如果拦截子View,返回true之外,还需要通知父View不再拦截。触摸事件 是针对view的 每次事件是个序列,会有id,index x , y。布局加载完成,每个view都设置监听器,拖拽其中一个,其他的都会收到回调。

2023-11-30 19:17:32 1063

原创 Okhttp 浅析

判断有没有超限,判断是否是同一个主机TCP端口以及加密方式和代理等配置是否相同,forwebsocket websocket 服务器主动发消息,推送数据,通过http连接。2拿不到则在连接池取一个不多重复用的连接,取出所有的call 并且取出的值小于设定的值,添加到正在执行的call。结果为空则执行,把call放到池里的连接。如果已经拿到连接,直接返回,否则再进行重试。5重新取池里多重复用的连接。3在拿一个多复用连接,4自己创建一个连接,Request 请求相关参数,初始的request。

2023-11-23 23:16:46 1604

原创 Retrofit 原理浅析 二

参数:1 classLoader,临时的classLoader,意义不大 ,2.数组,当前接口API , 3 InvocationHandler ,回调方法 核心invoke。retrofit.enqueue 则执行的是executorCallbackCall 包着OkHttpCall。2.check . add 取出进行处理,然后添加到Colltions 中,如果有父接口则报错,不能是泛型。判断是否是jdk8的默认方法,或者非静态方法,不进行加载default和static的方法。

2023-11-23 14:17:51 63

原创 TCP/IP

客户端发送关闭-服务端发送-服务端发送关闭-客户端发送关闭。网络层 TCP/UDP 属于网络层, 不会判断和处理编号。实现方式:心跳,在规定时间内使用TCP连接发送一个消息。传输层 负责拆分和组装 .期间会有编号。数据链路层 以太网 ,网络设备。TCP连接需要端口,进行通信。连接建立才可以用Http连接。应用层 负责发送/接收消息。Java 通过Socket。UDP 用户数据包协议。TCP 传输控制协议。省资源,否则占用资源。

2023-11-22 22:15:32 1303

原创 Java 编码

元数据-加密算法+加密密钥 = 密文 --->加密算法+解密密钥=元数据 比如加密用+4 解密用+5。重写equals 则重写hashCode,Equals相等则HashCode就相等。HashCode比Equalse快,先判断hashCode再判断equals。元数据---加密算法+密钥=密文 ----> 解密算法+密钥=元数据。Hash不是加密,MD5是不可逆加密算法,也不算加密算法。可以用私钥加密,公钥解密,公钥可以被计算出来。算法:RSA 加密+签名, DSA签名。通过加密算法和密钥进行。

2023-11-22 21:25:30 188

原创 java http

Range / Accept-Range分段加载,通过Content-Length判断总大小,Content_Range bytes xx-xx /xx加载的当前进度 / 总进度。Content-Length = number 数据长度,如果是二进制则不会准确,\n则会切断后面的数据,需要指定content-Length。FormBoundary 分割线,将多个数据进行切分,上传文件,或者二进制文件,可以通过这种方式。Last-Modufied 最后请求的一次标签,用于判断鉴定是否最新数据。

2023-11-22 01:21:02 580

原创 Android Serializable / Parcelable

Object -> ShareMemory -> Object 不需要IO,使用内存共享等方式。Parcelable 不是序列化,属于进程间通信,不需要IO/操作,没有拷贝内存的操作,影响内容,包括内容和子View,内部也会update,onDraw会调用改变。TCP协议将数据包拆分,进行发送,保证网络数据的可靠传输。按下抬起,会设置预按下,然后设置延时器 64ms。触控时也要计算mScrollX,Y。inline fun 内联函数。ViewGroup 计算偏移。Retrofit 性能损耗。

2023-11-21 19:05:45 395

原创 Java JVM虚拟机

args_size = x 参数数量,0位表示this,如果只有一个参数,则size = 3,double 占用两个, this 占用1个。第一部分 4字节 cafebaby 第二部分 版本号 00 00 00 32,栈会等线程创建时再创建,程序计数器记录偏移量,native则计数器为空。通过javap 反编译class ,javap xx.class。根据01和倒数第三位,是0则无锁,如果第三位是1代表lock。stack 操作数栈,如果相加,两个数入栈 然后add。继承关系改变 1.1以后。

2023-11-17 21:49:18 146

原创 BlockCanary

卡顿检测框架,比如Activity Service ,BroadcastResoleve等,或者有延时执行造成卡顿。根据dispathMessage判断是否造成卡顿,也就是消息的间隔。使用双重锁的单例模式,enable 跳转到通知。方法中设置开始和结束侦测。针对这些情况进行监控。Loop循环调用消息。

2023-11-17 13:11:34 196

原创 LeakCanary 内存检测

Android 中 -- finalize 执行回收,System.Gc也是执行回收,一般Gc不会立即调用 会延时。垃圾回收机制根据算法判断对象是否引用 通过引用计数法,被引用则次数+1。可达性分析,如果被相互引用,而没有被Gc检测到则也会回收。比如输入法引起的内存泄漏,厂商的内存泄漏 vivo 等。弱引用 软引用 虚引用,虚引用get方法返回Null。引入后自动初始化,不需要再Applition中初始化。watch:移除队列,创建弱引用。增加了AndroidX。观察某个Object。

2023-11-17 12:15:33 50

原创 HashMap

如果初始化小于0- -1则会抛异常,如果超出大小则取 1 << 30 = 10E。通过hash ,索引查找列表,判断hash是否相等,地址是否相等 equals。将数组第一位取值判断,为null 返回旧的值,如果没找到则添加元素,列表长度大于8的时候转为红黑树,判断链表是否大于64,然后转红黑树。扩容,如果在旧数组Index= 1 ,新的数组则为1 或者17。创建新节点,然后把原先的放到新节点,把旧的数据放到数组最后面。如果新的元素为null 则创建新的节点,并且添加到next。

2023-11-17 00:24:38 129

原创 Java 注解

interface中 定义的方法可以有 default 修饰,表示不写参数会用默认值, String value();value是定义的方法,使用时可以不写 value = xxx,如果是其他则声明 value = xxx。getClas().getName() 和 getClass().getCanonicalName() 区别。Inject属于依赖注入,把依赖权交给外部属于依赖注入,比如通过构造器传参也属于依赖注入。@interface,本质也是接口,也可以设置抽象方法,起到属性的作用。

2023-11-16 23:02:47 685

原创 Android 框架

OnFinishInflate ViewGroup 加载完成。ViewModel 是做暂时数据存储的,不是做MVVM。帮助我们写出更好的程序,会做一些拆分,在项目中应用。Google ViewModel 是保存数据的。1 外部数据 2 内存数据 3 表现数据。数据绑定是外部/表现数据和内存数据双向更新。MVVM是一种框架规则,双向绑定。Model 数据以及业务数据。MVP / 把C拆分出来。Control 控制器。MVC-单次调用逻辑把。

2023-11-15 23:45:50 227

原创 ClassLoader

BaseClassLoader是ClassLoader的子类,通过loadClass方法加载,Android将Java的ClassLoader简化了,第二个参数arg2 无效。new DexClassLoader时可以("path1:path2:path3:path4:path5:path6")查找父Loader,如果父加载器没有,就执行 findBootstrapClassOrNull()//空方法。split() -------- Unix系统分割使用 : ,Window使用;

2023-11-15 21:23:55 64

原创 Java 反射

Android 9 以后会更加严格,通过反射修改Activity,然后修改Activity的mInstrumentation,它会执行execStartActivty,然后跳过验证,跳过验证是否注册过的。ClassLoader 执行类时,解读字节码,每个类都是通过classloader加载出来的,虚拟机会创建第一个根classloader,然后根load加载其他的Classloader。插件化:从宿主APP加载插件APP的类,一般不能打开插件的activity,可以打开fragment。

2023-11-14 21:11:00 284

原创 Java 之 IO/NIO/OKIO

bufferedOutputStream.write 需要主动flush 或者等缓冲区 8192字节满的时候才会写入,因为有缓冲。//默认true 阻塞式。//支持非阻塞式,默认阻塞式,只有网络交互时支持非阻塞式,文件交互不支持。支持Buffer /可以对Buffer 进行操作 / 不强制使用Buff。读取,写入实在内存开辟空间,然后进行读写,需要及时释放。从buffer取出是读操作,buffer读是写操作。read(buffer) buffer是写的操作。可以通过buffer 减少其交互,增加性能。

2023-11-10 17:30:06 234

原创 Android RxJava3 原理浅析

实际设置定时任务的代码: ObservableInterval->subscribeActual。ObservableInterval 内部维护了一个IntervalObserver创建和取消。切换主线程 mainThread通过 :Looper.getMainLooper().subscribeOn(Schedulers.io()) 那么这个就不需要了。主要是看生产者有没有上游,有没有自己生产的 1 有上游,2自己生产的,按时间发送数据: 从0开始发送,间隔1秒。操作符: map,转换对象类型。

2023-11-10 12:36:07 257

原创 Android 多线程机制

AsyncTask 内存泄露 ,如果AsyncTask不加static 会一直持有使用它的类的引用,导致不能被Gc回收。Loop.myLoop()获取当前loop,内部实现是 mThreadLocal.get() 获取当前线程的loop。System.gc 有一个条件就是正在执行的线程/静态对象/直观的引用 不会被回收。内部类都会持有外部类的引用 可以使用WeakReference<> 弱引用持有。Loop.getMainLoop() 获取主线程Loop。Loop.loop 是个死循环。

2023-11-09 22:33:55 427

原创 Java / Android 线程间通信

wait 当线程操作数据较慢则使用wait等待时机,然后通过notify 或者notifyAll 进行通知, 然后再进行操作。thread.interrupt 会在合适的时机终止线程,也就是做一个标记为中断,非强制中断。Thread.interrupted() 会把当前线程状态改为中断,并改变其值为true。然后也需要调用对象的notify 和 这个对象的锁。thread.stop 这个方法会强制中断线程操作 已被弃用。这个时候需要使用对象的wait ------wait是Object的方法,

2023-11-09 21:11:32 421

原创 Java / Android 多线程和 synchroized 锁

内部创建线程池,和连接池一样. 包含了线程的创建 销毁等操作 (0 //默认大小,当超过最大值Integer.MAX_VALUE,就会销毁到默认大小)newFixedThreadPool 创建固定数量的线程,不推荐,如果用得少或者不用也会是这么多,而且不可扩展更多,用来处理多个集中任务。相比于thread,runnable可以重用 : Thread1(runnable),Thread2(runnable)死锁:多线程中,当前线程持有的锁,但拿不到需要进行执行代码中的锁,会一直等待。

2023-11-09 16:33:28 368

原创 Android MotionLayout

MotionLayout 通过description 绑定xml布局属性,在xml/创建MotionScene,通过<Transition><OnClick targenId clickAction> 处理反馈使用<ConstraintSet><COnstraint>设置场景。Go:动态替换动画布局展示,但是执行完会removeAllViews 需要再次绑定事件。ConstomAttribute ,设置自定义属性,通过get set设置值。通过AS的 desigin 查看MotionLayout的设置。

2023-11-08 21:16:49 201

原创 Android ConstraintLayout

layout_constraintDimensionRatio="16:9" 设置宽高比 比如 16:9 但是宽和高至少有一个为0dp,也可以配合"W:1:1" 表示宽计算出来,分配高度,或者"H,2:1" 表示高度计算出需要分配宽度。app:layout_constraintBaseline_toBaselineOf="@id/image_1" 基准线对齐。app:layout_constraintCircle="@id/image_1" //控件。

2023-11-07 23:10:44 803

原创 Android 嵌套滑动

实现NestedScrollindChild接口,或者NestedScrollindParent接口。

2023-11-07 21:10:05 424

原创 Android 拖拽浅析

startDragAndDrop 支持跨进程。

2023-11-07 20:55:51 28

原创 Android ViewGroup 浅析一

parent.requestDisallowInterceptTouchEvent(true) 当前若是滑动控件,且拦截子View,除了子View cancel,还要通知上一级View不再拦截,如果在滑动控件,触摸到子View则父View会收到InterTouch,子View收到TouchDown,而父View收不到TouchDown,scrollTo参数是相反。.coerceAtMost(width)下限。.coerceAtLeast(0) 上限。VelocityTracker 记速器。

2023-11-07 16:11:24 141

原创 Android 多点触控

point_move 两个point,当第二根手指up,index会设置为0而不是1,有时候第0根手指down 为0index的会给按下的,然后0变为1。action_move 不适合这种方法,因为在实时移动 更新,没有所谓的Point 也就是index ,id,只有在down / up 才有意义。for遍历event.point,通过getX(index) 如果某一个point抬起会报错 找不到Index,这时可以通过id查找。三种类型 :接力型 /配合型 /单独型。

2023-11-07 12:29:57 113

原创 Android 双向滑动

private val gestureDetector = GestureDetectorCompat(context, simpleGenListener) //gestureDetector.setIsLongpressEnabled(false) //关闭长按。// currentScale = currentScale.coerceAtLeast(smallScale).coerceAtMost(bigScale) //最大值。// //双击之后的后续操作。

2023-11-06 22:34:43 226

原创 Android View 触摸反馈原理浅析

event.Action会拿到多个事件 如down 可能会action-down - action-pointer-down,会融合多个事件。ActionMarked相比Action,适用于多点触控 //ACTION_POINTER_UP 非第一根手指抬起。//所有的触摸事件都是一个序列,如Down-Up,Down-Up-Cancel,Down-Move。返回true,表示消费事件,所有触摸反馈不再生效,返回事件所有权。else{子View.dispatchTouchEvent}//event 触摸事件。

2023-11-06 12:38:14 159

原创 Linux /Ubuntu .sh 找不到命令

【代码】Linux /Ubuntu .sh 找不到命令。

2023-11-05 22:41:03 131

原创 Window 7 / 10 / 11 .bat .cmd 中文路径不识别解决方案

进行转为UTF-8 编码就可以实现中文路径识别。

2023-11-03 21:02:50 873

原创 View绘制流程

/添加到docorView。activity 通过attch关联Window(PhoneWindow),PhoneWindow通过setContentView关联View。

2023-11-03 20:54:27 118

原创 Android 自定义ViewGroup

0 //早期Android witchSpecSize 默认时0,现在Android 写不写0会影响计算结果。0 //早期Android witchSpecSize 默认时0,现在Android 写不写0会影响计算结果。0 //早期Android witchSpecSize 默认时0,现在Android 写不写0会影响计算结果。0 //早期Android witchSpecSize 默认时0,现在Android 写不写0会影响计算结果。

2023-11-03 15:45:30 172

空空如也

空空如也

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

TA关注的人

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