- 博客(75)
- 收藏
- 关注
原创 对Handler中ThreadLocal的理解
插个查看源码的链接:https://cs.android.com/ThreadLocal 可以把一个对象保存在指定的线程中,对象保存后,只能在指定线程中获取保存的数据,对于其他线程来说则无法获取到数据。Android系统在 Handler 机制中使用了它来保证每一个 Handler 所在的线程中都有一个独立的 Looper 对象。ThreadLocal是什么呢?ThreadLocal 是一个关于创建线程局部变量的类。其实就是这个变量的作用域是线程,其他线程访问不了。通常我们创建的变量是可以被任何
2020-07-16 18:00:14
1040
原创 从源码角度分析Android事件分发机制
分发机制:从点击屏幕开始,就会产生从Activity到DecorView然后一直到最里层的View的一系列事件及传递过程,每一层View或者ViewGroup都有可能会拦截或消费该事件,通过调用它的dispatchTouchEvent方法来判断,是否在当前View层消费该事件View的事件分发,首先从一段伪代码上来看(个人觉得最简洁的事件分发总结,代码来自《Android开发艺术探索》):public boolean dispatchTouchEvent(MotionEvent event) {
2020-05-21 17:24:04
230
原创 apk优化技巧
apk优化,其实就是缩小apk的体积。最近在做一个海外贷款项目,对apk的体积大小有要求,不能大于8M,所以专门调研了一下apk优化技巧,并做记录。apk体积优化关注点:资源图片,小于200px的图片,建议使用SVG形式,进行矢量图适配,形成xml文件来使用,可以大幅缩小apk体积,其他图片使用webp压缩。使用方法: res --> new --> vector asset就可以生成SVG格式图片。在selector中也可以使用,只需要配置一下即可 国际化配置,限定使用的语言,可..
2020-05-20 11:15:49
359
原创 flutter学习系列一:编写一个登录界面
写在前面flutter貌似最近越来越火热了,为了紧跟潮流,参考学习flutter实战试着编写了一个登录界面。学习目标可以熟练编写基本界面,总结相关控件widget的使用技巧登录界面的实现:一、界面逻辑和内容界面很简单:一个logo,一个账号输入框、一个密码输入框、一个登录按钮拆解开页面和功能:appbar(title和返回键); body(账号输入框、密码输入...
2019-12-19 12:03:02
784
原创 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
705
原创 Android Handler机制再解读
一、handler机制是什么? handler是Android用于线程间通信的一种机制二、怎么从子线程发送消息到主线程?//在主线程中初始化Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ...
2019-10-08 19:10:29
188
原创 重写Android事件分发机制
实践是检验真理的唯一标准!重写事件分发机制,布局如下:布局代码如下:<com.example.mayn.mytesteventdispatchpro.MyOuterViewGroup android:id="@+id/outer" android:background="#ff0000" android:layout_width="350dp"...
2019-09-10 17:00:19
180
原创 android.os.TransactionTooLargeException,android.app.servertransaction.PendingTransactionActions的解决
Binder传输的数据太大导致的异常。如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出TransactionTooLargeException。解决方法:不要将大量数据传入Binder最近在我们的页面中有5个fragment,然后会保存大量数据,跳转到下一个activity的时候,等2-3秒就会直接闪退,经过查找文档,确认需要以下方案:于是我仔细分析...
2019-08-16 12:04:38
2034
原创 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
2355
原创 记录一个坑:webview使用post请求传递参数中包含+号的问题
webview使用post请求时候,需要传递参数,可以拼接如下:但是,对于传递的参数中含有“+”号等特殊字符的时候,需要先进行一次转化,否则后端接到的“+”号会转成空格,导致接口校验错误。解决办法是:postData = postData.replace("+","%2B");将加号转换为%2B,这样后台就可以正常接收了。...
2019-05-08 19:43:01
2069
1
原创 bat脚本快速打包App
最近有个需求,需要使用脚本快速打包App,我的希望是一键打包,不执行多余的操作脚本命令如下:gradlew clean&&gradlew assembleRelease&&jarsigner -digestalg SHA1 -sigalg SHA1withRSA -verbose -keystore app/签名文件.jks -signedjar 签...
2019-05-08 10:43:49
1421
原创 Android同一手机同时安装debug和release版本App
最近有个需求,我们要在同一手机上同时安装测试包和正式包,logo名称自定义。话不多说,直接撸代码:首先,在App的build.gradle里添加如下配置:buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-andr...
2019-04-29 11:36:05
1696
原创 Retrofit请求不同的baseURL方式
记录一下retrofit完全请求不同的baseURL的方式方式一:在baseApi类中,根据ApiService接口中的不同header切换不同的baseURL。public Retrofit getRetrofit(String baseUrl) { HttpLoggingInterceptor loggingInterceptor = getLoggerInterc...
2019-04-09 15:47:45
3410
原创 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
3194
原创 Mac版SVN使用技巧总结
Mac版SVN在AndroidStudio中使用技巧记录:1、查看文件提交记录:要查看某一个文件的提交记录,打开当前文件,在将光标放在类名上,然后选择vcs菜单,subversion--show history for class即可查看 ...
2018-09-06 11:05:48
1170
原创 Git原理及使用
Git采用的是分布式版本控制系统,相对于SVN的集中式版本控制系统来说,分布式的好处有:分布式版本控制系统的安全性更高,因为每个人电脑里都有完整的版本库;Git强大的分支管理一、安装Git:1、在Linux上安装git首先,可以在命令行工具试着输入git,看看系统有没有安装git$ gitThe program 'git' is currently not installed....
2018-08-28 20:04:29
211
原创 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
5421
1
原创 我对RxJava与背压的理解
通俗易懂一句话:RxJava其实就是观察者模式与异步的结合。首先来看看观察者模式:举例在警察抓小偷这个事件中,警察作为观察者,小偷作为被观察者,在现实生活中,警察一直监控着小偷,当小偷发生盗窃行为时,警察抓住小偷。在我们Java的观察者模式中,小偷通过订阅警察,当小偷在实施盗窃行为时,通知警察此行为,由警察实施抓捕,这就是Java中的观察者模式。再比如:“按下开关,台灯点亮”,在此事件中,台灯作为...
2018-05-31 16:06:38
2886
1
原创 记录一个关于红米note 5A手机text文本不显示的bug
最近在开发中遇到一个问题,recyclerview嵌套recyclerview的时候,内部的recyclerview里的item是一个TextView,显示在红米note 5A手机上时候仅有占位,字体不显示出来。发现是在布局中没有对TextView设置textcolor,对于红米note 5A手机,必须显式地指定textcolor才可以让TextView显式出来。谨记...
2018-05-18 09:06:16
599
原创 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
3778
原创 view的绘制流程
1、绘制的整体流程当一个应用启动时,会启动一个主activity,Android系统会根据Activity的布局来对它进行绘制。绘制会从跟视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,ViewGroup还要负责通知自己的子View进行绘制操作。performTraversals方法的核心代码:1、performMeasu...
2018-05-02 22:08:55
190
转载 Android 8.0系统的通知栏适配
今天早上看到郭霖大神公众号推送了一篇文章:Android 8.0的通知栏适配,自己做个记录我们知道,Android 8.0系统的最大改进就是通知栏适配和应用图标,关于应用图标的适配在后续文章中记录,现在先记录一下通知栏的适配google从8.0开始,引入了通知渠道这个概念,通知渠道就是指每一条通知都要属于一个对应的渠道。每个App可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权掌...
2018-04-18 21:51:21
976
原创 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
204
原创 微信支付接入流程
微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)时序图:统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。商户系统和微信支付系统主要交互说明:1. 用户在商户APP中选择商品,提交订单,选择微信支付。2. 商户后台收到用户支付单,调用微信支付统一下单接口。3. 统一下单...
2018-04-14 10:08:55
774
原创 TCP/UDP协议
参考链接http://blog.chinaunix.net/uid-26833883-id-3627644.html 一、TCP协议:TCP协议是面向连接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。1、三次握手过程a.请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1415531521)。这个SYN段为报...
2018-04-11 22:59:25
156
转载 Android图片加载框架的对比
参考链接https://blog.csdn.net/u013134722/article/details/56676078参考链接https://www.cnblogs.com/fightingchendan/p/5972985.html参考链接https://www.jianshu.com/p/3ac30878c72c
2018-04-11 21:56:40
192
原创 Android 常见的设计模式
单例模式:分为懒汉式和饿汉式EventBus就是使用的单例模式,双重锁+volatile。工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这...
2018-04-11 21:24:14
135
原创 Android 常见的设计模式的SOLID原则
1、SOLID原则1.1 单一职责原则:定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生...
2018-04-11 21:19:46
513
原创 Android Binder机制
1、binder是什么Binder的英文原意是“胶水”的意思,其实很形像了。Binder模糊了进程边界,淡化了进程间通信的过程,整个系统仿佛运行于同一个面向对象的程序之中。形形色色的Binder对象以及星罗棋布的引用仿佛粘接各个应用程序的胶水。要理解binder当然要从Linux说起。2、Linux基础为了保护进程空间不被别的进程破坏或者干扰,Linux中的进程是相互独立的,也就是所谓的进程隔离。...
2018-04-11 17:27:43
143
原创 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
130
原创 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
252
原创 图片加载框架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
404
原创 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
367
1
原创 Android WebView深度学习一
1、WebView的状态//激活WebView为活跃状态,能正常执行网页的响应webView.onResume() ;//当页面被失去焦点被切换到后台不可见状态,需要执行onPause//通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。webView.onPause();//当应用程序(存在webview)被切换到后台时,...
2018-04-10 22:07:07
201
原创 Android性能优化总述
1、Android性能优化包括:布局优化、绘制优化、内存优化、响应速度优化、bitmap优化、线程优化等2、布局优化的思想很简单,就是尽量减少布局文件的层级,减少Android绘制时的工作量布局优化的方法:1、删除布局中无用的控件和层级,有选择性地使用性能较低的ViewGroup。例如:布局中既可以使用LinearLayout又可以使用RelativeLayout的时候,采用LinearLayou...
2018-04-10 21:47:07
178
原创 android加载超清无损大图--BitmapRegionDecoder类
1、BitmapRegionDecoderBitmapRegionDecoder主要用于显示图片的某一块矩形区域,如果你需要显示某个图片的指定区域,那么这个类非常合适。对于该类的用法,非常简单,既然是显示图片的某一块区域,那么至少只需要一个方法去设置图片;一个方法传入显示的区域即可;详见:BitmapRegionDecoder提供了一系列的newInstance方法来构造对象,支持传入文件路径,文...
2018-04-10 09:20:34
1134
转载 图片缓存机制--LruCache内存缓存
我们可以通过下面的代码看出每个应用程序最高可用内存是多少int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性...
2018-04-09 23:26:09
837
转载 图片缓存机制-DiskLruCache磁盘缓存
1、磁盘缓存 DiskLruCache参考链接 https://blog.csdn.net/guolin_blog/article/details/28863651记录总结:防止多图OOM的核心解决思路就是使用LruCache技术。但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。因此使用到了DiskLruCache...
2018-04-09 21:49:39
538
原创 handler运行机制
Handler就是解决线程和线程之间的通信的。handler的使用场景:1)主线程中使用、2)子线程中使用handler1)主线程中使用示例:public class MainActivity extends AppCompatActivity { private Handler handler = new Handler(){ @Override pub...
2018-04-09 20:36:04
544
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人