自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 资源 (4)
  • 收藏
  • 关注

原创 RecyclerView优化总结

一、铺垫1.RecycleBin先介绍一个简单的复用池实现,它通过SparseArray类型的缓存变量实现,注意它并不是线程安全的,只能在UI线程中使用。public class RecycleBin<T> { private final SparseArray<Queue<T>> map; public RecycleBin() { ...

2019-09-26 17:58:30 1339 3

原创 Android 页面销毁、重建与数据恢复

Android页面销毁、重建与数据恢复一、页面销毁和重建1.页面销毁2.页面重建和数据恢复3.模拟页面销毁和重建二、一些拓展的问题1.TextView的数据恢复2.Fragment的数据恢复3.数据如何存储和恢复三、参考文章一、页面销毁和重建1.页面销毁Android的页面销毁可以分两种,正常的销毁和非正常的销毁。在正常的销毁情况下,页面的状态信息被丢弃,不会被重建,比如调用了activit......

2019-06-04 20:43:25 6357 3

原创 RecyclerView局部刷新和原理介绍

RecyclerView局部刷新和原理介绍一、引言二、局部刷新的正确使用姿势三、局部刷新的原理3.1 RecyclerView与Adapter建立观察者模式3.2 onItemRangeChanged()3.3 dispatchLayoutStep1()3.3.1 processAdapterUpdatesAndSetAnimationFlags()3.3.2 记录Views信息3.3.3 运行p...

2019-03-08 14:18:02 6889 5

原创 Matrix框架慢函数检测和分析

一、引子  Matrix 是一款微信研发并日常使用的 APM(Application Performance Manage),当前主要运行在 Android 平台上。Matrix 当前监控范围包括:应用安装包大小,帧率变化,启动耗时,卡顿,慢方法,SQLite 操作优化,文件读写,内存泄漏等等。  本文主要介绍下对于慢函数的监控。二、使用方法1.在项目根目录下的 gradle.prope...

2019-03-01 15:51:25 4571

原创 说一说线程池对象的回收

一、引子  现在的业务开发中用到了ReactNative,热更新的代码下发使用的是GeckoClient框架。之前开发同学的实现是在Rn的基类Fragment和Activity中,创建一个GeckoClient成员变量,然后进行更新。这样,每个Rn的Fragment和Activity都有一个自己的GeckoClient实例,而GeckoClient中又有一个执行异步任务的线程池变量,而Rn的F...

2019-02-26 18:20:35 3586

原创 Java与Js通信总结

在android hybrid app开发过程中,经常要面对的一个问题是java与js的通信。android程序是由dalvick虚拟机来运行,javascript是由webview的webkit引擎来解析执行,本质上应该是dalvick虚拟机的一部分,所以两者通信是要看android底层api留了多少口子出来。一、js向java传递数据(js调用java) 1.android提供给开发者的是往j

2016-12-05 17:15:55 3650

原创 EventBus源码分析

前言、提问1.EventBus如何使用?2.EventBus的执行流程?3.onEvent****(Object o)与onEvent****(具体的类型)比较,哪个效率更高?各有什么好处?4.EventBus注册查找等是在UI线程实现吗?EventBus的消息处理如何实现在UI线程、后台线程、异步线程里运行?5.post()和postStick()方法的区别?6.Even...

2016-03-22 19:46:58 944

原创 两行代码提升TextView性能--PreComputedTextCompat

异步计算文本高度,提升文本性能

2022-10-08 20:27:13 453 1

原创 kotlin初始化的坑--java初始化语句块去哪了

java和kotlin 初始化语句块的不同

2022-09-28 11:47:49 607

原创 kotlin获取class类型

Kotlin class类型

2022-09-28 10:59:47 3570

原创 kotlin data class和普通class区别

使用限制先说data class 使用上的限制data class必须要有带参数的构造方法Data class must have at least one primary constructor parameter2. data class 不能被继承Modifier ‘data’ is incompatible with ‘open’实现区别普通classclass VisibilityChangeRecord(val position: Int)转成javapu

2021-10-29 10:43:59 5103

原创 java按位与

// 错误写法 public static boolean bitValue() { return (flag & (1L << 4)) == 1; } // 正确写法1 public static boolean bitValue(String name) { return ((flag & (1L << 4)) & 0x1) == 1L; } // 正确写法2...

2021-06-20 21:55:17 208

原创 adb常用命令集合

adb 通过 schema 启动页面adb shell am start -d “schema://host?key1=value1’&'key2=value2”注意点:schema的完整路径需要包在"" (双引号)中,否则不会启动应用,提示为:no matches found XXX多个key之间使用&连接,但&需要用’’(单引号连接)value 支持String、int等类型,如果为string,不必加上双引号,比如refer=my_favorites 或ref

2021-06-06 20:28:15 655

原创 说下kotlin lateinit

例子lateinit 是kotlin的关键字,和var一起使用,用来声明一个不可空的不用立刻赋值的变量。通常用法是: private lateinit var mScore: TextViewfun init(view: View) { mScore = view.findViewById(R.id.score)}fun updateScore(score: Int) { mScore.text = "分数为:$score"}相对于val和var而言,有几个好处:不用

2021-06-06 19:05:44 678 1

原创 Activity.getApplicationContext()导致空指针

引子开发中使用Activity的getApplicationContext()竟然出现空指针崩溃java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.ss.android.article.news/com.bytedance.ugc.message.NotificationListActivity}: java.lang.NullPointerException: Attempt to invoke v

2021-03-26 18:25:53 1362

原创 如何获取带参数的ViewModel

大家都知道,不带参数的ViewModel获取方法使用非常简单,final UserModel viewModel = ViewModelProviders.of(this).get(UserModel.class);那如果一个带参数的ViewModel,应该如何获取呢?class MsgActivityModel(extras: Bundle?) : ViewModel() {}它的使用需要定义一个继承于AndroidViewModelFactory的工厂类, private inne

2021-01-29 21:31:38 2021

原创 LayoutInflater.inflate()的返回值

LayoutInflater.infalte(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)的返回值是 resource 对应View吗?答案是否定的:Returns View The root View of the inflated hierarchy. If root wassupplied and attachToRoot is true, this is root; otherwise it

2021-01-29 21:17:14 390

原创 JSONObject.optLong()丢失精度的问题

这里写自定义目录标题问题发现JSONObject.put()功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入JSONO...

2021-01-28 11:25:13 751

原创 Android代码生成view的id

Android代码生成idAndroid 4.2之后,View增加了一个代码生成id的方法,可以被用来设置View的id,并且不会和appt生成的R.id冲突。 private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); public static int generateViewId() { for (;;) { final int result = sNextG

2021-01-27 20:35:46 1760

原创 xml布局中系统View标签为何不需要带包名

一、引子在xml文件中,如果想使用TextView、WebView、Button、RelativeLayout等系统View,直接写类名即可,但如果是自定义的View,则需要写带有包名的全类名,否则运行时会报错。这是为什么呢?二、查找原因我们知道xml文件都是通过LayoutInflater.inflate()方法解析的,我们从这个方法找下答案: public View inflat...

2019-10-09 21:02:16 460

原创 Activity对象创建到显示到屏幕

代码基于Android 28(9.0、pie)分析一、引子在Activity启动流程分析一文中,分析了从startActivity()到Activity对象创建的过程,之后分析下Activity对象创建到显示到屏幕的过程。二、Activity对象创建到显示到屏幕2.1 activity.attach()这里从上部分最后的activity.attach()方法讲起 final vo...

2019-10-09 16:52:31 381

原创 Android一些细节点

1.LayoutInflater类的inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)方法inflate(resource, root)与inflate(resource, root, false)的区别root非空时,前者会将inflate的View添加到root中,且返回值为roo...

2019-09-17 15:22:22 226

原创 Activity启动流程分析

代码基于Android 28(9.0、pie)分析一、startActivty()到Activity对象创建Activity.startActivity()、Activity.startActivityForResult()、Context.startActivity()调用的都是Instrumentation.execStartActivity(Context who, IBinder co...

2019-09-08 21:20:37 405

原创 (未完)Android 点击事件响应总结

一、从Activity/Dialog到DecorViewActivity或Dialog先响应到dispatchTouchEvent()事件,拿Activity为例public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUs...

2019-09-08 15:06:32 251

原创 RecyclerView.RecycledViewPool+BaseQuickAdapter+FooterLayout造成IllegalStateException

一、RecyclerView有一个优化设置,如果多个RecyclerView拥有相同的item布局,可以通过使用一个RecycledViewPool来减少缓存的View数目。 public void setRecycledViewPool(@Nullable RecycledViewPool pool) { mRecycler.setRecycledViewPool(poo...

2019-09-05 22:20:11 919

原创 DialogFragment的onDismiss()中为何无法获取到View的位置

一、问题发现Android有一种切换输入法显示和隐藏的方法val mInputManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManagermInputManager?.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS)...

2019-09-05 21:26:00 946 1

原创 由TransactionTooLargeException引发的一些思考

引子我所在部门的Android app维护时间比较久,一直保持在targetSdkVersion 22。最近oppo、vivo几家应用商店停止targetSdkVersion低于26的app更新,迫不得己,同事升级了targetSdkVersion到26,主要进行了权限处理、FileProvider处理等。新版应用发布后,却出现了一些TransactionTooLargeException崩溃,...

2019-05-19 22:35:36 2689 2

原创 使用AsyncLayoutInflater预加载,加快列表渲染

引子列表卡顿是一个很常见的问题,通常的理解是滑动过程中卡顿,有很多常规的处理方法,从最简单的复用到降低布局复杂度到图片加载。本文介绍下列表初次填充数据时卡顿的处理方法。AsyncLayoutInflater在查找页面fps过低的问题中,我发现在列表首次填充数据进行显示时,由于列表中将要显示在屏幕中的ViewHolder都要被创建,进而这些ViewHolder的View都要被Inflate出来...

2019-05-13 11:31:39 4301 4

原创 View.getContext()从何而来

一、引子曾经遇到一个问题,使用View的Context变量调用startActivity()方法,出现一个异常:“Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?”。百度了下异常的原...

2019-05-10 19:07:12 1108

原创 kotlin if判定分支中有范型方法和null返回造成的空指针

写了一段代码,造成了空指针WallpaperUtil.displayWallpaper(pageLifecycle, item, helper.getView(R.id.wallpaper_image), if (item.isHot()) null else helper.getView(R.id.wallpaper_live_ic))异常堆栈如下(第26行即为上部分代码):2019-0...

2019-03-17 21:00:29 671

转载 Improve RecyclerView Performance

原文地址:https://medium.com/@farshidabazari/improve-recyclerview-performance-ede5cec6c5bfIn my last project, I’ve been working on an application that has a vertical list which every item has a horizonta...

2019-03-11 11:26:47 247

原创 RxJava防重复点击原理

(代码基于rxbinding-1.0.1)使用RxJava实现View防重复点击功能比较简单fun View.noDoubleClick(action: Action1&amp;amp;amp;lt;Void&amp;amp;amp;gt;) { @Suppress(&amp;amp;quot;DEPRECATION&amp;amp;quot;) RxView.clicks(this) .throttleFirst(400

2019-02-28 15:09:14 2954

原创 说一说Glide.with()

一、引子  Glide框架是google推荐的Android图片加载框架,使用起来非常轻便,比如以下代码就可以实现在fragment内,以fitCenter方式加载图片,未加载成功前显示placeholder。```javaGlide.with(fragment) .load(myUrl) .placeholder(placeholder) .fitCente...

2019-02-26 18:17:12 13422

原创 一次ThreadPoolExecutor中maximumPoolSize误用

之前对于ThreadPoolExecutor的几个参数corePoolSize,maximumPoolSize,keepAliveTime,BlockingQueue的理解是:corePoolSize:核心线程数maximumPoolSize:线程池最大线程数,包括coreThread,所以应大于等于corePoolSizekeepAliveTime:允许存活时间,线程池是为了...

2018-12-29 18:41:28 4199 3

原创 不当使用BaseQuickAdapter和notifyItemRemoved出现IndexOutOfBoundsException

1.描述:RecyclerView BaseQuickAdapter notifyItemRemoved()在使用EmptyView,并且有headerView时,删除列表中唯一一个元素会崩溃2.崩溃详情:java.lang.IndexOutOfBoundsExceptionInconsistency detected. Invalid view holder adapter posi...

2018-12-21 20:46:50 2163

转载 Android软引用(SoftReference)与LruCache

android缓存实现弱引用实现缓存在android中并不可靠

2017-12-06 14:54:29 421

原创 Thread的join()方法

看到一个多线程的编程问题,如何让线程A、B、C顺序执行,即线程A执行完后,线程B开始执行,线程B执行完后,线程C开始执行。 我的实现想法是使用单线程的线程池,依次将RunableA、RunnableB、RunnableC三个Runnable submit()。答案给的是使用Thread的join()方法,编了个程序验证下:package com.zn.jinma.test;public class

2016-12-20 18:29:00 650

转载 异常分析初探

转载于:异常分析初探 楚岩 2016-01-29 14:08:20异常在Java中是非常重要的一个内容,了解异常有助于我们写出更加健壮的代码,本文将探讨一下几个问题:1 异常是怎么被JVM捕获的? 2 新建异常实例是否耗时?为什么会耗时?是否能够避免? 3 为什么不推荐使用printStackTrace()打印异常信息? 4 spring jdbc运行时异常种类概要 5 什么时候应该抛出数

2016-12-06 16:49:59 561

原创 hook Activity的mInstrumentation变量

hook 动态代理

2016-09-06 21:18:06 1535

原创 慎用AsyncTask

AsyncTask 卡顿

2016-04-27 16:23:30 2268 2

android view事件传递分析

android view事件传递分析

2016-03-14

同时启动两个Activity测试

同时启动两个Activity测试代码 activity生命周期

2016-02-23

Activity和Fragment生命周期研究

Activity Fragment 生命周期研究

2016-02-01

Zxing的库文件

利用Zxing编写条码识别软件所需要的库

2012-05-15

空空如也

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

TA关注的人

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