- 博客(47)
- 收藏
- 关注
原创 Handler原理
Handler前言一、流程二、使用步骤参考前言一、流程Looper.myLooper的实现:调用了线程的get方法Static final ThreadLocal<Looper> sThreadLocal=new ThreadLocal<Looper>();是一个线程池。存放了Looper,当我们直接去取,当然如果没有内容,就会出错,这也是子线程调用出错的原因,但是在主线程中调用为什么就不会报错,原因是主线程启动时先调用了looper.prepare()方法和loop
2023-09-13 23:13:40
305
原创 Synchronized、volatile、Lock
锁概述一、synchronized实现原理二、使用步骤1.引入库2.读入数据总结概述解决什么问题?synchronized 是开发中解决同步问题中最常见,也是最简单的一种方法。synchronized作用域:方法同步和代码块同步。synchronized 常用的三个作用:原子性即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行;可见性可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值;有序性防止编译器和处
2023-09-13 18:21:55
422
原创 ANR原理篇 - service/broadcast/provider超时机制
Service Timeout:比如前台服务在20s内未执行完成;BroadcastQueue Timeout:比如前台广播在10s内未执行完成ContentProvider Timeout:内容提供者,在publish过超时10s;InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件。以上分类详情可见Google官方文档ANRs定义以上4个场景中,service、broadcast、provider的超时机制较为相似,可以类比为一个引爆炸弹的过程,
2023-05-16 20:53:12
560
原创 ANR原理篇 - Input超时机制
当input事件处理得慢就会触发ANR,那ANR内部原理是什么?为了理解input ANR原理,需要先了解整个input框架的处理流程,详细可参考ANR基础-Input系统,先来回顾一下input流程。事件分发dispatch过程中会通过一个变量记录当前执行时间,下一次事件分发过程会检测该时间,如果ANR时间区间超过timeout时长(即5s)则会执行ANR流程,弹出ANR弹框。
2023-05-16 20:51:52
684
原创 ANR基础 - Input系统
当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备节点, 这便产生了最原生态的内核事件。接着,输入系统取出原生态的事件,经过层层封装后成为KeyEvent或者MotionEvent;最后,交付给相应的目标窗口(Window)来消费该输入事件。可见,输入系统在整个过程起到承上启下的衔接作用。Input模块的主要组成:Native层的InputReader负责从EventHub取出事件并处理,再交给InputDispatcher;
2023-05-16 20:50:52
559
原创 ANR原理篇 - ANR信息收集过程
发生ANR时,会有哪些日志,以及如何解读?logcat中记录的日志。这里主要起到的是打印的作用,打印一些ANR的信息,以及会把一些CPU状态打印出来。data/anr/目录下生成对应的ANR日志文件。这里面主要记录的是dump进程的信息。dropbox中记录的信息。包括了logcat日志中的部分以及ANR文件中的部分。ANR显示和日志生成原理讲解理解Android ANR的信息收集过程。
2023-05-15 15:22:25
928
原创 ANR基础篇 - 相关系统知识简介
大小核架构非大小核架构大中小核架构线程 CPU 运行状态分析技巧 - Runnable 篇线程 CPU 运行状态分析技巧 - Running 篇CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇Android Systrace 基础知识 - CPU Info 解读。
2023-05-15 15:21:04
1174
原创 ANR概述
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
2023-05-15 15:18:39
1702
原创 ANR实战案例 - FCM拉活启动优化
本篇文章总结呈现了笔者开发中的疑难ANR问题解决,一般做海外业务的同学才会用到Firebase库,但解决问题的思路类似。当碰到此类疑难ANR问题,trace.txt获取不到与应该相关堆栈时,可参考本篇思路进行分析。
2023-05-15 15:14:49
851
原创 ANR实战案例1 - Google广告导致ANR解决
Google广告作为出海应用较为常见的接入SDK,其产生的ANR解决相对较为困难,可参考笔者开发中方案。
2023-05-15 15:12:56
725
原创 ANR实战案例3 - 应用在部分低端机ANR优化案例
相对于中高端机,低端机上出现ANR的频率更高,且更为棘手,笔者总结了长期实际开发者低端机ANR的解决案例,可参考文中解决方案。
2023-05-15 15:09:27
723
原创 ANR工具篇 - 监控工具
国内目前主流的ANR线上日志收集工具是Bugly,海外有Google Play和Firebase。三者各有优势,Bugly日志显示较全,但缺乏线程状态;Google Play作为海外应用市场发布的标准,但捕获的日志信息目前较为简单;Firebase可作为Google Play日志的不错,关键日志更详细。
2023-05-12 14:04:10
281
原创 ANR工具篇 - 分析工具
ANRWatchdog + Crashlytic实现监控+上报,捕获线上ANR日志。ANRWatchdog:接入后在控制台打印类似Crash的疑似卡顿堆栈。Matrix通过监听 SIGQUIT 信号,来达到监控 ANR 的目的。Systrace + TraceView解决较为复杂,比较难定位的ANR。
2023-05-11 18:07:27
526
原创 EventBus源码解析
EventBus是一个Android/Java平台基于订阅与发布的通信框架,可以用于Activities, Fragments, Threads, Services等组件的通信,也可以用于多线程通信。优点是开销小、使用简单、以及解耦事件发送者和接收者。
2023-04-25 18:18:25
652
原创 OkHttp3源码解析 - 拦截器
拦截器是OkHttp中比较优秀的一个设计,也是OkHttp的核心功能所在,其中包含五大内置拦截器和自定义拦截器,每个拦截器各司其职,通过责任链模式将请求逐层分发。
2023-04-25 11:26:29
785
原创 OkHttp3源码解析 - 请求流程
在Android蛮荒年代,我们做网络请求通常会选用HttpURLConnection或者Apache HTTP Client,这两者均支持HTTPS、流的上传和下载、配置超时和连接池等特性,但随着业务场景的复杂化以及对流量消耗的优化需求,OkHttp应运而生。现在谈起网络请求,大家肯定下意识想到的就是 okHttp 或者 retrofit 这样的三方请求库。
2023-04-24 20:26:48
764
原创 并发编程三大利器
并发编程三大利器前言一、Synchronized二、Atomic包1.VolatileVolatile的作用:Volatile的原理:volatile无法保证原子性2.读入数据总结前言一、SynchronizedQ:既然有了Synchronized关键字做并发,为什么还会有Lock包?Synchronized缺点(与Lock包区别):1.无法判断锁状态,不知道当前锁是否锁住还是没有锁住2.不可中断,如果线程迟迟拿不到一把锁,这把锁被其他线程占用,会出现该线程一直等待3.Synchronize
2022-03-03 18:20:54
2594
原创 Axure无法打开问题解决
1、打开本地原型稿,进入resource–>Chrom下,找到.crx扩展程序,如下:复制然后修改后缀为.rar,解压该rar文件2、打开Google浏览器–>更多工具–>扩展程序,如下:点击加载已解压的扩展程序,选择上一步解压后的文件夹,重新打开设计稿.html页面就可以正常加载了。...
2020-05-28 17:04:52
4752
原创 Manifest merger failed with multiple errors, see logs处理
1、问题项目合并第三方提供的aar,报错:2、打开logcmd进入项目路径–>gradlew processDebugManifest --stacktrace可以看到详细错误3、解决当我们项目Manefest的某些属性和第三方库中Manefest的属性有冲突会报上面的错误。比如第三方库中也定义了icon、allowBackup等属性,且会与你的项目不同,则发生冲突,编译就...
2019-12-19 19:52:55
254
原创 List的remove()问题
场景描述:在做需求中,对一个list遍历并过滤掉其中特定的数据 这种场景 。但是按照平常的使用方式,发现报错了。public static void main(String[] args) {String str1 = new String(“abcde”);String str2 = new String(“abcde”);String str3 = new String(“abcde...
2019-12-06 15:19:00
401
原创 inflate()布局属性不生效问题
最近项目抽取一个公共的父布局时,使用inflate动态加载头布局时,出现xml"最外层的属性" 不生效的情况,解决办法如下:解决办法:1、设置rootView,attachToRoot默认为true((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.navigation_l...
2019-12-06 15:04:49
1508
原创 SparseArray、ArrayMap和HashMap
在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不能达到更好的性能,相反反而更消耗内存,所以针对Android这种移动平台,也推出了更符合自己的api,比如SparseArray、ArrayMap用来代替HashMap在有些情况下能带来更好的性能提升。S...
2019-07-16 15:15:12
328
原创 Retrofit2+Okhttp3网络请求
权限<uses-permission android:name="android.permission.INTERNET"></uses-permission>//retrofit2 api 'com.squareup.retrofit2:retrofit:2.2.0' api 'com.squareup.okhttp3:okhttp:3.2.0' api 'c...
2019-06-14 17:47:08
4841
原创 jks与keystore区别
keystore 是Eclipse 打包生成的签名。jks是Android studio 生成的签名。都是用来打包的,并保证应用的唯一性,这就是他们的最大的区别!备注:很多第三方市场,我们上传apk的时候,他们只支持keystore,需要我们把.jks签名转化为.keystore!例:百度地图开发版SHA1值和发布版SHA1值的获取一、开发版SHA1值获取直接通过.android目录...
2019-06-13 16:14:58
16318
原创 Android日常踩坑
1、RadioGroup设置默认选择,出现选中两个的问题场景:设置RadioGroup其中一个RadioButton默认选中,即android:checked=“true”,切换选项的时候默认选中项一直处于选中状态,出现两个子项同时被选中的情况解决办法:给RadioGroup 设置选中的RadioButton,例:selectRadioGroup.setOnCheckedChangeList...
2019-06-06 15:25:08
314
原创 NDK环境相关
最近在之前老项目中进行NDK开发,发现在Android Studio中编写C代码时候,编译器没有自动补全的提示,很蛋疼,于是研究通过以下方法成功解决:1、创建完成jni目录,生成.h文件及创建.c文件2、rebuild项目,生成Android.mk文件Android.mk文件内容如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)...
2019-05-23 16:05:48
112
原创 EventBus多次接收踩坑
今天添加一个EventBus的时候,偶然发现@Subscribe标签下的回调执行了多次,但是只post了一次事件,很奇怪,之前使用不会有这个问题!post:经过打log调试,最终发现是EventBus.getDefault().register(this);注册了多次导致:由于业务中BaseFragment会被多次创建,而导致多次执行register,最终将EventBus.getDe...
2019-05-23 14:15:26
10378
翻译 for循环遍历集合时add或remove
之前使用foreach循环add数组元素时抛出ConcurrentModificationException,故总结如下:运行:foreach循环时调用add,抛出java.util.ConcurrentModificationException异常:可参考阿里编程手册的foreach中remove/add反例,截图如下:上述例子把’1"换成"2",remove时则不会抛出异常。故分析...
2019-05-17 20:28:45
3636
原创 JNI属性与方法访问实例
1、Java实现:package com.test.jni;import java.util.Random;import java.util.UUID;public class JniTest { public String key = "jason"; public static int count = 9; public native static String ...
2019-05-11 08:55:50
208
原创 JNI开发流程
JNI(Java Native Interface)Java调用C/C++,C/C++调用Java的一套APIEclipse + vs编写Jni流程:1.编写native方法2.javah命令,生成.h头文件3.复制.h头文件到CPP工程中(Visual Studio中)4.复制jni.h和jni_md.h文件到CPP工程中(从jdk中搜索复制,解决.h文件引用jni.h头文件报错)...
2019-05-10 18:15:06
472
原创 c中宏定义
宏定义(宏替换、预编译指令)define指令1、定义标识#ifdef _cplusplus 标识支持c++语法 //防止文件重复引入(早期使用宏函数,之后版本可用#pragma once)2.定义常数(便于修改和阅读)#define MAX 100 int MIN = 40;(区别:Java中常量有类型)3.定义“宏函数”例一:#include <stdlib.h>...
2019-05-09 17:36:14
296
原创 c中枚举、联合体
联合体(共用体)不同类型的变量共同占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,节省内存;联合体变量的大小=最大的成员所占的字节数,最后一次赋值有效例:union MyValue{ int x; int y; double z;};void main(){ union MyValue d1; d1.x = 90; d1.y = 100;//最后一次赋值...
2019-05-06 10:52:20
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人