自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 技术栈

    作为面试官见过很多候选人,包括阿里p7、百度t6、美团资深等大厂的;在聊到技术宽度和深度时,有些人并没有清晰的认识。    是时候总结一下技术栈了, 就像照镜子一样找出自己掌握了哪些能力,还欠缺哪些知识. ...

2018-10-19 12:07:13 515 0

原创 再看一遍Retrofit

说起来Retrofit是Android App常用的轮子, 原理比较简单; 就是通过动态代理解决函数注解, 从而方便实现http请求逻辑; 从架构角度, 我们能从Retrofit源码里学到什么呢? 1、深入理解动态代理的应用范围, 这是retrofit的核心逻辑; 2、声明各种注解表示不同的...

2019-11-10 21:47:59 34 0

原创 Kotlin object关键字详解

一、object用途 1、用户标识匿名内部类; 2、对象说明(编译时生成静态实例)。 二、修饰内部类对象 btn.setOnClickListener(object: OnClickListener { override fun onClick(p0: View?) { ...

2019-10-27 14:35:34 179 0

原创 Android性能优化系列-监听View inflate周期并动态替换

LayoutInflater hook点 在Activity里执行setContentView或者inflate布局文件最终都会走到如下代码: LayoutInflater.java View createViewFromTag(View parent, String name, C...

2019-10-13 16:20:15 138 0

原创 ButterKnife R2作用和删除

在使用ButterKnife时library工程的注解会使用R2, 为什么使用R2而不是R呢? 如上图所示R.class中参数定义使用了final关键字, 即R.class里全部是常量; 而R2.class里全部是变量。 PS:Java语言在编译时常量内联, 即使用常量值替换参数; ...

2019-10-06 20:02:49 493 0

原创 sqlitedatabase is locked

在操作Orm数据库sqlite时, 当存在多线程/多进程并行写时报错。 支持同一时刻多个读, 但同一时刻只能有一个写(不能有读); 简单记: 读写、写写是互斥的, 读读是可以并发的。 因为多线程、多进程可以通过数据库名称操作同一个数据库, 建议只在一个进程中实例单例访问同一个数据库, 从而实...

2019-09-25 19:49:52 47 0

原创 Activity渲染完成第一帧时机

Activity第一帧渲染涉及知识点setContentView流程、帧绘制流程和帧率监听等。 开始时间: hook ActivityThread的Instrumentation, 得到Activity各个生命周期的开始、结束时间; 参考: Activity的生命周期是谁调用的? 注...

2019-09-22 10:25:53 452 0

原创 安卓View点击/曝光的监听方式

Android点击、曝光事件的监听分散在代码的各个角落, 不利于开发维护。 其实可以将这2种行为收敛到一起, 运行时监听Activity的生命周期,即ActivityLifeCallBack回调; 在onResume或onStart函数里判断当前acitivity是否添加了自定义ViewGrou...

2019-09-15 19:12:39 386 0

原创 安卓9启动Activity流程分析和优化建议

Android在从9.0版本开始修改了启动Activity流程, 跟以往版本的主要区别在于使用了Translation。 Android9.0代码:clientTransaction.addCallback函数传入了LaunchActivityItem。 final boolean realS...

2019-08-24 18:05:03 129 0

原创 Android性能优化系列-IdleHandler

IdleHandler是在主线程空闲时执行同步任务, 即可以做优先级低的业务逻辑。 对于启动新Activity可以在cmd窗口执行adb logcat -s ActivityManager | grep “Displayed” 得到时长。 用法: public DemoActivity ex...

2019-08-19 21:08:56 227 0

原创 Android Drawable缓存

Android获取Drawable对象方式为getResources().getDrawable(@DrawableResId int res), 只可能返回ColorDrawable、BitmapDrawable对象, 当然id不存在会抛异常。 public abstract class Dr...

2019-08-02 10:39:20 232 0

原创 Android View座标

手机屏幕左上角座标是(0, 0), 右下角座标是(w,h)即屏幕宽和搞。 获取View位置: View方法 说明 getLocationOnScreen 获取View左上角距离屏幕左上角的距离x和y getLocationInWindow ...

2019-07-22 07:46:43 97 0

原创 Live Template撸码利器

参考:https://www.jianshu.com/p/488f2d73e71d 手动输入代码太辛苦, 拼敲键盘速度? 赶快试用代码补全功能吧。 IntelliJ idea和Android Studio都支持代码自动补全功能, 如上面所示的几个场景。 在工作中可以把常用的代码块总结到模板里, 输...

2019-07-20 18:13:06 225 0

原创 Java调用Kotlin函数的坑

看下这段代码执行main函数结果如何, 会打印"执行了method函数"么? class DemoClass { fun method(str: String) { System.out.println("执行了method函数")...

2019-07-20 17:46:21 853 0

原创 可拖拽的ListView

长按拖拽item并实现变更排序; 说明: WindowManager在addView时尚未测量完成, 获取宽高都是0。 可以这样测量: view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);...

2019-07-05 20:28:49 844 1

原创 地图类业务优化方法

一、背景 在百度地图、高德地图上显示Marker, 如果显示数量很多时,滑动地图会出现卡顿的现象。 根本原因是地图是个耗内存的功能, 我们看到的地图和marker都是Bitmap。 想想在手机屏幕上添加100个小的Bitmap和背景的大Bitmap需要多少内存? 这些图片没有复用机制,都是储存在...

2019-06-16 18:31:19 140 0

原创 ByPhoto-秒开的安卓图片选择库

一、背景 ByPhoto是个安卓图片选择库, 在启动渲染速度上做了很多优化; 荣耀8真机测试,图库里有3000多张图片。 冷启动图片选择页渲染完成需800ms左右, 热启动(即第二次打开Activity)渲染需要300ms。 真正实现了秒开的用户体验。 二、需求 1、支持图片预加...

2019-06-12 19:43:32 444 0

原创 Android根据座标找到对应的View

在界面上点击按钮时,想想安卓是如何找到能响应事件的顶层View的? 如果给你坐标x、y, 你能找到对应的顶层View么? 首先安卓布局根节点是DecorView,并呈现为多叉树结构; 每个顶层View都是一个页节点; 需求:手指在界面上滑动时显示对应的顶层View。 <?xml ...

2019-05-30 09:50:46 387 0

原创 Java和Kotlin编译基础知识

Java和Kotlin都是跨平台语言, 归功于在编译时生成的字节码与平台无关, jvm在装载字节码后即可运行。 Java Kotlin 编译 javac kotlinc 运行 java kotlin Java语言使用javac编译为字节码, Kotlin使用kotli...

2019-05-27 15:47:52 240 0

原创 Long monitor contention with owner

安卓Activity在finish后出现黑屏, 大概率是因为主线程卡死。 抓trace和logcat。 04-16 16:18:17.359 W/m.lianjia.beik(30714): Long monitor contention with owner Binder:30714_6 ...

2019-04-16 17:27:56 4317 0

原创 Glide preload和into的区别

一、背景 贝壳2.6.0版本使用Glide preload方法替换了部分显示图片的方式, 在灰度期间发现控件显示了错误的图片或者崩溃问题。 Fatal Exception: java.lang.RuntimeException:Canvas: trying to use a recycled...

2019-04-08 18:17:19 233 0

原创 Flutter开发Feed流笔记二

仿照贝壳找房app看点页实现feed流功能。 UI使用了:tabbar+tabbarview+ListView http通讯:Dio json:json_serializable 下载刷新/加载更多:flutter_refresh 遇到问题: 1、 tabbarview在切换标签页后,...

2019-03-24 09:37:38 245 0

原创 Flutter开发Feed流笔记一

第一个知识点: 如何隐藏AppBar? 包一层宽高等于0的父容器就可以了。 return new Scaffold( appBar: PreferredSize( child: AppBar( ), pre...

2019-03-17 17:53:27 219 0

原创 HTTP302丢Session

安卓app在打开第一个H5页面时app设置了Session, H5返回302跳转到相同域下的另一个H5, 这时丢了Session。 public class MainActivity extends Activity { private WebView mWebView; @Ov...

2019-03-17 10:08:11 194 0

原创 Arrays.asList的坑

问题: 直接原因: public void add(int index, E element) { throw new UnsupportedOperationException(); } 举个例子:下面2种方式有什么区别? 第一种 第二种 第二种运行时会崩溃...

2019-03-13 21:19:43 81 0

原创 贝壳找房APP安装包瘦身

一、背景 在满足产品、UI要求的前提下,尽量减少安装包体积。 以customer插件为例: 插件大小为5MB, 其中1MB是dex,而bkbase占了dex的580KB; 3.1MB是图片。 减少res目录体积效果会更明显。 二、方法 1、删除冗余代码、资源文件, 可使用lint扫描; 安卓...

2019-03-12 19:41:42 121 0

原创 删除TextView上下内边距

原理参考: https://blog.csdn.net/harvic880925/article/details/50423762 通过自定义控件删除上下内边距, UI走查时就不用担心间距不对了。 代码: public class MyTextView extends TextView ...

2019-03-08 16:55:55 529 0

原创 一个小Demo带你理解安卓事件分发

   安卓事件分发是个老生常谈的话题, 在ScrollView高度测量原理介绍Android View测量原理, 现在再用个实例讲解事件分发原理。    本文要搞懂2个问题。 1、 事件是怎么产生的? 2、事件是怎么传递的?     手指在屏幕上一滑, framework层的ViewRoo...

2019-02-17 10:04:14 219 0

原创 贝壳找房FEED流曝光策略

摘要:目前贝壳找房的曝光策略边界条件比较单一, 都是APP端写死的逻辑;对标一线公司解决方案, 是由API下发每种卡片/Feed的门限条件, 从而得到更精准的数据。 一、背景 目前贝壳找房APP端的曝光时机是写死的, 触发条件:卡片必须要完整展示在界面上; 在列表界面上下/左右滑动时单次/多次...

2019-02-16 22:29:19 421 0

原创 ScrollView高度测量原理

       在使用Lint扫描工程时,看到这个提示。 Google推荐将ScrollView的子View高度设置为wrap_content,  但实际业务开发时可能根节点是LinearLayout(layout_height="match_parent"), 然后发现屏幕显不...

2019-02-14 14:18:59 1080 0

原创 Flutter事件分发

   大道同源, 其实Flutter的事件分发跟安卓类似。 下面就详细介绍下Flutter的事件分发体系: 1、 Flutter所有事件源头是 hooks.dart文件的_dispatchPointerDataPacket函数, 接收屏幕的点击、滑动等等各种事件。 类似于安卓的ViewRootI...

2019-02-12 11:24:18 1555 0

原创 理解Future执行时序原理

    在Flutter开发中,一般使用Future、Stream、async/wait使用异步操作。 Future类用于异步任务、Stream类主要用文件IO, 而async/wait是关键字。    官方介绍:Dart消息循环 https://webdev.dartlang.org/arti...

2019-01-31 14:42:50 857 0

原创 Dart事件总线

因为Flutter不支持反射, 所以无法实现像EventBus那样通过注解添加观察者并反射执行对应函数。 在Flutter开发中, 可以通过单例模式和观察者模式实现事件总线, 参考Flutter事件分发原理支持发同步、异步消息。     暂时不支持黏性事件, 后续有需要的话再完善, 把Event...

2019-01-29 11:18:58 488 0

原创 Flutter生命周期

Flutter跟安卓的Activity、iOS的ViewController一样拥有自己的生命周期, Flutter中一切都是Widget,渲染方式有点像H5的DOM树。 先看生命周期图: Flutter生命周期可以分为3个阶段: 1、实例化组件并添加到树, 即Navigato...

2019-01-21 20:06:15 4579 2

原创 自定义lint规则解决开发中的问题

一、背景 在发贝壳2.1.1版本第一次灰度时遇到了一个崩溃(崩溃在租房),第二次灰度版本时发生了相同原因的崩溃(崩在了二手)。 当时的做法是发现一处解决一处, 但没发现的隐藏问题是个定时炸弹。 日志: java.lang.RuntimeException: Parcelable encoun...

2019-01-08 19:30:22 574 1

原创 红黑树TreeMap总结

   红黑树是自平衡的二叉查找树,又称二叉B树。它可以在O(logN)时间复杂度内完成查找、增加、删除操作。红黑树是在二叉查找树基础上增加了着色和左右旋转使得红黑树相对平衡, 与AVL树相比,红黑树并不追求所有子树的高度差不超过1,而是保证从根节点到叶子节点的最长路径不超过最短路径的2倍。红黑树通...

2018-12-30 16:07:16 131 0

原创 安卓适配动态权限说明

一、背景:       从Android6.0版本开始google将权限分为普通权限和特殊权限,app必须在AndroidManifest.xml添加引用权限的语句。 在安装apk时安卓会将普通权限授予该app,但特殊权限需要运行时申请。       安卓按照权限类别分为权限组和权限, 每个权...

2018-11-26 22:12:25 580 0

原创 贝壳找房app使用Glide替换Picasso

贝壳找房app使用Glide替换Picasso现状改造成本原理Glide比Picasso的2个优势:展望 现状 操作步骤:打开贝壳找房,设置城市为“徐州”, 然后点击“二手房”图标进入“二手房列表页”, 向上滑动列表。 使用Picasso 使用Glide 上图是Android Prof...

2018-09-22 08:28:11 308 0

原创 自定义Android Gradle插件的3种方式

因为gradle插件是在编译过程中生效, 不用修改代码就能实现很多功能, 几乎每个app都使用了gradle插件。 下面就介绍一下自定义gradle插件的3种方式。 https://docs.gradle.org/current/userguide/custom_plugins.html#exa...

2018-09-18 11:32:54 2201 0

原创 360 Replugin Binder实现原理

     在安卓日常app开发过程中一般自定义Service并实现Binder, 且常用的ActivityManager/WindowManager/TelephonyManager最终都是通过ServiceManager.getService取到IBinder对象。         那么是不是...

2018-09-13 13:52:19 169 0

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