
技术总结
平.Sir
一个有态度的程序员
展开
-
对Handler中ThreadLocal的理解
插个查看源码的链接:https://cs.android.com/ThreadLocal 可以把一个对象保存在指定的线程中,对象保存后,只能在指定线程中获取保存的数据,对于其他线程来说则无法获取到数据。Android系统在 Handler 机制中使用了它来保证每一个 Handler 所在的线程中都有一个独立的 Looper 对象。ThreadLocal是什么呢?ThreadLocal 是一个关于创建线程局部变量的类。其实就是这个变量的作用域是线程,其他线程访问不了。通常我们创建的变量是可以被任何原创 2020-07-16 18:00:14 · 1194 阅读 · 0 评论 -
从源码角度分析Android事件分发机制
分发机制:从点击屏幕开始,就会产生从Activity到DecorView然后一直到最里层的View的一系列事件及传递过程,每一层View或者ViewGroup都有可能会拦截或消费该事件,通过调用它的dispatchTouchEvent方法来判断,是否在当前View层消费该事件View的事件分发,首先从一段伪代码上来看(个人觉得最简洁的事件分发总结,代码来自《Android开发艺术探索》):public boolean dispatchTouchEvent(MotionEvent event) {原创 2020-05-21 17:24:04 · 285 阅读 · 0 评论 -
apk优化技巧
apk优化,其实就是缩小apk的体积。最近在做一个海外贷款项目,对apk的体积大小有要求,不能大于8M,所以专门调研了一下apk优化技巧,并做记录。apk体积优化关注点:资源图片,小于200px的图片,建议使用SVG形式,进行矢量图适配,形成xml文件来使用,可以大幅缩小apk体积,其他图片使用webp压缩。使用方法: res --> new --> vector asset就可以生成SVG格式图片。在selector中也可以使用,只需要配置一下即可 国际化配置,限定使用的语言,可..原创 2020-05-20 11:15:49 · 414 阅读 · 0 评论 -
flutter 学习笔记 & 踩坑记录
1、flutter在Android studio中开发,查看log的方式:在代码中打印log的地方使用debugPrint(“”)方式,然后在Android Studio中Terminal中使用如下命令:flutter logs,即可查看log。取消查看,ctrl+C。eg:2、学习的一个小技巧,可以借助使用map或者list去动态生成,让变化对应变化,而不是cv大法。例如如下:要...原创 2019-12-12 12:01:41 · 787 阅读 · 0 评论 -
Android 设置一个textview显示大小不同的字体
最近有个需求,一个文本textview,显示不同大小的字体。需求如下:金额后面的“元”字字号小点,使用安卓原生的工具类,具体设置如下:String money = “12344.50”;money = formatToSepara(money)+"元";Spannable sp = new SpannableString(money);sp.setSpan(new Absolu...原创 2019-04-09 15:33:46 · 3262 阅读 · 0 评论 -
我对RxJava与背压的理解
通俗易懂一句话:RxJava其实就是观察者模式与异步的结合。首先来看看观察者模式:举例在警察抓小偷这个事件中,警察作为观察者,小偷作为被观察者,在现实生活中,警察一直监控着小偷,当小偷发生盗窃行为时,警察抓住小偷。在我们Java的观察者模式中,小偷通过订阅警察,当小偷在实施盗窃行为时,通知警察此行为,由警察实施抓捕,这就是Java中的观察者模式。再比如:“按下开关,台灯点亮”,在此事件中,台灯作为...原创 2018-05-31 16:06:38 · 2975 阅读 · 1 评论 -
记录一个关于红米note 5A手机text文本不显示的bug
最近在开发中遇到一个问题,recyclerview嵌套recyclerview的时候,内部的recyclerview里的item是一个TextView,显示在红米note 5A手机上时候仅有占位,字体不显示出来。发现是在布局中没有对TextView设置textcolor,对于红米note 5A手机,必须显式地指定textcolor才可以让TextView显式出来。谨记...原创 2018-05-18 09:06:16 · 656 阅读 · 0 评论 -
RecyclerView自适应高度
近期代码中需要用到recyclerview自适应高度的功能,其自适应高度并不能像gridview或者listview那样自定义view,而是应该用自定义layoutmanager来进行控制** * Created by $ Ping.sir on 2018/5/3. * recyclerView自适应高度 */public class MyGridLayoutManager extend...原创 2018-05-03 11:40:56 · 3849 阅读 · 0 评论 -
view的绘制流程
1、绘制的整体流程当一个应用启动时,会启动一个主activity,Android系统会根据Activity的布局来对它进行绘制。绘制会从跟视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,ViewGroup还要负责通知自己的子View进行绘制操作。performTraversals方法的核心代码:1、performMeasu...原创 2018-05-02 22:08:55 · 223 阅读 · 0 评论 -
Android Apk瘦身
1、apk的结构APK文件由一个ZIP存档组成,其中包含组成应用程序的所有文件。这些文件包括Java类文件,资源文件和包含编译资源的文件APK包含以下目录:META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。assets/:包含应用可以使用AssetManager对象检索的应用资源。res/:包含未编译到的资源 resources.arsc。li...原创 2018-04-14 10:35:36 · 230 阅读 · 0 评论 -
微信支付接入流程
微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)时序图:统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。商户系统和微信支付系统主要交互说明:1. 用户在商户APP中选择商品,提交订单,选择微信支付。2. 商户后台收到用户支付单,调用微信支付统一下单接口。3. 统一下单...原创 2018-04-14 10:08:55 · 850 阅读 · 0 评论 -
Android 8.0系统的通知栏适配
今天早上看到郭霖大神公众号推送了一篇文章:Android 8.0的通知栏适配,自己做个记录我们知道,Android 8.0系统的最大改进就是通知栏适配和应用图标,关于应用图标的适配在后续文章中记录,现在先记录一下通知栏的适配google从8.0开始,引入了通知渠道这个概念,通知渠道就是指每一条通知都要属于一个对应的渠道。每个App可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权掌...转载 2018-04-18 21:51:21 · 1020 阅读 · 0 评论 -
Android Binder机制
1、binder是什么Binder的英文原意是“胶水”的意思,其实很形像了。Binder模糊了进程边界,淡化了进程间通信的过程,整个系统仿佛运行于同一个面向对象的程序之中。形形色色的Binder对象以及星罗棋布的引用仿佛粘接各个应用程序的胶水。要理解binder当然要从Linux说起。2、Linux基础为了保护进程空间不被别的进程破坏或者干扰,Linux中的进程是相互独立的,也就是所谓的进程隔离。...原创 2018-04-11 17:27:43 · 172 阅读 · 0 评论 -
Android JNI/NDK开发
一、JNI的开发流程首先在java中声明native方法,接着用C或者C++实现native的方法,就可以编译运行了1、在java中声明native方法public class JniTest { static { System.loadLibrary("jni_test"); } public static void main(String[] args)...原创 2018-04-11 17:02:02 · 156 阅读 · 0 评论 -
Android生成二维码图片及在图片上添加文字并保存
近期接到一个需求,将一串文字生成二维码,并在点击图片时将二维码图片保存到相册。话不多说,上代码/** * Created by $ Ping.sir on 2018/8/14. * 二维码工具类 */public class QRCodeUtil { private static final String CHARSET = "UTF-8"; private sta...原创 2018-08-24 11:34:20 · 5522 阅读 · 1 评论 -
Git原理及使用
Git采用的是分布式版本控制系统,相对于SVN的集中式版本控制系统来说,分布式的好处有:分布式版本控制系统的安全性更高,因为每个人电脑里都有完整的版本库;Git强大的分支管理一、安装Git:1、在Linux上安装git首先,可以在命令行工具试着输入git,看看系统有没有安装git$ gitThe program 'git' is currently not installed....原创 2018-08-28 20:04:29 · 259 阅读 · 0 评论 -
Android Handler机制再解读
一、handler机制是什么? handler是Android用于线程间通信的一种机制二、怎么从子线程发送消息到主线程?//在主线程中初始化Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ...原创 2019-10-08 19:10:29 · 209 阅读 · 0 评论 -
重写Android事件分发机制
实践是检验真理的唯一标准!重写事件分发机制,布局如下:布局代码如下:<com.example.mayn.mytesteventdispatchpro.MyOuterViewGroup android:id="@+id/outer" android:background="#ff0000" android:layout_width="350dp"...原创 2019-09-10 17:00:19 · 205 阅读 · 0 评论 -
android.os.TransactionTooLargeException,android.app.servertransaction.PendingTransactionActions的解决
Binder传输的数据太大导致的异常。如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出TransactionTooLargeException。解决方法:不要将大量数据传入Binder最近在我们的页面中有5个fragment,然后会保存大量数据,跳转到下一个activity的时候,等2-3秒就会直接闪退,经过查找文档,确认需要以下方案:于是我仔细分析...原创 2019-08-16 12:04:38 · 2113 阅读 · 0 评论 -
Map过滤掉空value,并按照顺序拼接成字符串
在使用retrofit进行网络请求的时候,传递的map参数中如果存在空的value,则会报异常,那么我们就需要将map中存在空value的对象去除掉,具体操作如下:Set<String> set = map.keySet();Iterator<String> it = set.iterator();while (it.hasNext()) { Stri...原创 2019-06-12 17:28:45 · 2458 阅读 · 0 评论 -
记录一个坑:webview使用post请求传递参数中包含+号的问题
webview使用post请求时候,需要传递参数,可以拼接如下:但是,对于传递的参数中含有“+”号等特殊字符的时候,需要先进行一次转化,否则后端接到的“+”号会转成空格,导致接口校验错误。解决办法是:postData = postData.replace("+","%2B");将加号转换为%2B,这样后台就可以正常接收了。...原创 2019-05-08 19:43:01 · 2179 阅读 · 1 评论 -
bat脚本快速打包App
最近有个需求,需要使用脚本快速打包App,我的希望是一键打包,不执行多余的操作脚本命令如下:gradlew clean&&gradlew assembleRelease&&jarsigner -digestalg SHA1 -sigalg SHA1withRSA -verbose -keystore app/签名文件.jks -signedjar 签...原创 2019-05-08 10:43:49 · 1479 阅读 · 0 评论 -
Android同一手机同时安装debug和release版本App
最近有个需求,我们要在同一手机上同时安装测试包和正式包,logo名称自定义。话不多说,直接撸代码:首先,在App的build.gradle里添加如下配置:buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-andr...原创 2019-04-29 11:36:05 · 1777 阅读 · 0 评论 -
Retrofit请求不同的baseURL方式
记录一下retrofit完全请求不同的baseURL的方式方式一:在baseApi类中,根据ApiService接口中的不同header切换不同的baseURL。public Retrofit getRetrofit(String baseUrl) { HttpLoggingInterceptor loggingInterceptor = getLoggerInterc...原创 2019-04-09 15:47:45 · 3475 阅读 · 0 评论 -
Mac版SVN使用技巧总结
Mac版SVN在AndroidStudio中使用技巧记录:1、查看文件提交记录:要查看某一个文件的提交记录,打开当前文件,在将光标放在类名上,然后选择vcs菜单,subversion--show history for class即可查看 ...原创 2018-09-06 11:05:48 · 1253 阅读 · 0 评论 -
Android xml解析方式
常用的xml解析方式有三种:SAX解析、pull解析和DOM解析。Android推荐的解析方式是pull解析pull解析小巧灵便,解析速度快,是Android推荐的解析方式try { //得到xml解析器 XmlPullParser pullParser = Xml.newPullParser(); InputStream is = getAssets().open("xx...原创 2018-04-11 16:47:27 · 278 阅读 · 0 评论 -
图片加载框架Glide的使用及源码分析
1、对比图片加载框架Glide和Picasso的对比:Picasso:compile 'com.squareup.picasso:picasso:2.5.1'Glide:compile 'com.github.bumptech.glide:glide:3.7.0'Glide默认加载图片是RGB_565的,而Picasso默认加载的图片是ARGB_8888的,会比Glide更占用内存,但是图片质量要...原创 2018-04-11 11:39:11 · 453 阅读 · 0 评论 -
Android WebView深度学习二 通过webview与js进行交互
1、Android调用JS1.1 通过webview的loadUrl方法1.2 通过webview的evaluateJavaScript方法 此方法在Android 4.4及以上才支持,向下兼容性较差2、JS调用Android2.1 通过webview的addJavaScriptInterface()方法进行对象映射2.2 通过webviewClient的shouldOverrideUrlLoa...原创 2018-04-11 09:15:03 · 403 阅读 · 1 评论 -
ZoomImageView实现手势操作图片的单击
最近项目中需要用到手势放大与缩小图片,类似于云相册的功能,还需要图片的单击网上查找了一个ZoomImageView,可以实现图片放大缩小以及双击放大等操作,但是没有单击效果。而且经查看该类的代码,发现使用到的手势识别ScaleGestureDetector会将点击事件拦截ZoomImageView的代码如下:package ;import android.annot原创 2017-11-16 16:49:42 · 877 阅读 · 0 评论 -
TabLayout设置指示器的宽度
TabLayout的指示器的高度、颜色都可以设置,但是宽度需要自己来实现在TabLayout view初始化后,设置/** * @date:2017/11/9/009 * @author:平sir * @desc: 设置tablayout的指示器的宽度 */private void initView() { mTabLayout.post(new Runnable(原创 2017-11-14 21:50:30 · 2830 阅读 · 4 评论 -
Android 6.0运行时权限问题
google在2015年就推出了Android 6.0系统,我们也知道,在Android 6.0系统中,最重要的就是提供了动态权限管理,也叫做运行时权限机制对于Android 6.0的运行时权限机制,有以下几点:1、6.0系统默认为targetSDKVersion小鱼23的应用授予了所申请的全部权限,因此,对于6.0以前的版本,我们可以设置targetSdkVersion=22,程序运行时原创 2017-11-14 21:24:53 · 321 阅读 · 0 评论 -
CardView的属性详解
Android 5.0给我们提供了design风格的设计模式,其中就有cardview ,那么 cardview是继承自framelayout的,并且可以设置圆角和阴影,使得控件具有立体效果,当然,cardview也可以包含其他的布局容器和控件cardview的属性: card_view:cardConnerRadius 设置圆角的半径 card_view:ca原创 2017-11-13 21:50:37 · 1794 阅读 · 0 评论 -
recyclerView的使用
我们经常会在项目中使用recyclerview,今天就从源码的角度来真正认识和分析一下recyclerview1、recyclerview继承ViewGroup,并且实现了ScroolingView和NestedScrollingchild接口2、为recyclerview设置LayoutManager,Google为我们提供了三种类型的layoutmanager,LinearLayo原创 2017-11-13 21:25:38 · 462 阅读 · 0 评论 -
greenDAO对数据库操作的升级问题
最近项目中用到了数据库,第三方库greenDAO对数据库操作的封装有特别好用,因此在项目中集成了greenDAO。但是当项目版本升级的时候,遇到了数据库升级的问题。经查greenDAO的源码,发现它对数据库升级的源码是将原有的数据库删除,重新建立新的数据库了。如果不想删除原有的数据,那么就涉及到数据库升级问题,数据库升级比较麻烦的就是数据的迁移问题库文件下定义:greendao {原创 2017-10-24 21:19:57 · 321 阅读 · 0 评论 -
Android ANR产生的原因及定位分析
只有当App的UI线程响应超时才会引起ANR,超时一般有两种:1、当前的事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件由于某种原因被阻塞了;2、当前的事件正在处理,但是耗时太长没能及时完成。典型的ANR问题场景:1、UI线程存在耗时操作,例如UI线程中存在网络请求、数据库操作或者文件操作等。Android 4.0以后,如果在UI线程进行网络操作会直接报异常2、UI线程等原创 2017-10-23 21:07:20 · 690 阅读 · 0 评论 -
Android View的绘制流程
首先,Android UI管理系统的层级关系为:activity{phoneWindow[decorView(titleview,contentview)]},phonewindow是activity中最基本的窗口系统,是activity和view交互的接口,decorview本质上是一个framelayout,包含了titleview和contentview绘制首先是从根视图viewroot原创 2017-10-23 19:58:10 · 191 阅读 · 0 评论 -
Android MVP模式
说到MVP模式,先来回顾一下MVC模式:model-view-controlAndroid中的MVC的角色定义分别为:模型层(Model) 我们针对业务模型,建立的数据结构和相关的类,就可以理解为Model,Model是与View无关,而与业务相关的。视图层(View) 一般采用xml文件或者java代码进行界面的描述,也可以使用javascript+html等原创 2017-10-22 12:48:40 · 286 阅读 · 0 评论 -
Android内存优化全解
要学习Android的内存优化,首先要了解Java虚拟机。Android基于的是Dalvik虚拟机,简称DVM,与Java虚拟机JVM并不一样。另外,Android 4.4以后基于的是ART虚拟机;1、DVM:DVM是基于寄存器的,它没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈指令,同时指令更紧凑更简洁。执行的字节码是.dex形式的,DVM会用dx工具将所有的.class文件转换为一个.dex...原创 2017-10-22 12:13:07 · 270 阅读 · 0 评论 -
Android设置强制竖屏
设置强制竖屏的方法:1、在Manifest清单列表文件中设置两个属性值即可:android:screenOrientation="portrait"android:configChanges="orientation"也可以设置在theme中,成为全局性...原创 2016-12-27 11:06:49 · 2798 阅读 · 2 评论 -
Android不透明度色值
安卓透明度问题:00%=FF(不透明) 5%=F2 10%=E5 15%=D8 20%=CC 25%=BF 30%=B2 35%=A5 40%=99 45%=8c 50%=7F 55%=72 60%=66 65%=59 70%=4c 75%=3F 80%=33 85%=21原创 2017-11-16 18:46:54 · 622 阅读 · 0 评论