android
文章平均质量分 58
ZHxin
coder
展开
-
两行代码提升TextView性能--PreComputedTextCompat
异步计算文本高度,提升文本性能原创 2022-10-08 20:27:13 · 455 阅读 · 1 评论 -
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 · 5128 阅读 · 0 评论 -
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 · 1374 阅读 · 0 评论 -
如何获取带参数的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 · 2024 阅读 · 0 评论 -
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 · 392 阅读 · 0 评论 -
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 · 1770 阅读 · 0 评论 -
使用AsyncLayoutInflater预加载,加快列表渲染
引子列表卡顿是一个很常见的问题,通常的理解是滑动过程中卡顿,有很多常规的处理方法,从最简单的复用到降低布局复杂度到图片加载。本文介绍下列表初次填充数据时卡顿的处理方法。AsyncLayoutInflater在查找页面fps过低的问题中,我发现在列表首次填充数据进行显示时,由于列表中将要显示在屏幕中的ViewHolder都要被创建,进而这些ViewHolder的View都要被Inflate出来...原创 2019-05-13 11:31:39 · 4308 阅读 · 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 · 1109 阅读 · 0 评论 -
由TransactionTooLargeException引发的一些思考
引子我所在部门的Android app维护时间比较久,一直保持在targetSdkVersion 22。最近oppo、vivo几家应用商店停止targetSdkVersion低于26的app更新,迫不得己,同事升级了targetSdkVersion到26,主要进行了权限处理、FileProvider处理等。新版应用发布后,却出现了一些TransactionTooLargeException崩溃,...原创 2019-05-19 22:35:36 · 2696 阅读 · 2 评论 -
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 · 674 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 6908 阅读 · 5 评论 -
说一说线程池对象的回收
一、引子 现在的业务开发中用到了ReactNative,热更新的代码下发使用的是GeckoClient框架。之前开发同学的实现是在Rn的基类Fragment和Activity中,创建一个GeckoClient成员变量,然后进行更新。这样,每个Rn的Fragment和Activity都有一个自己的GeckoClient实例,而GeckoClient中又有一个执行异步任务的线程池变量,而Rn的F...原创 2019-02-26 18:20:35 · 3594 阅读 · 0 评论 -
Android 页面销毁、重建与数据恢复
Android页面销毁、重建与数据恢复一、页面销毁和重建1.页面销毁2.页面重建和数据恢复3.模拟页面销毁和重建二、一些拓展的问题1.TextView的数据恢复2.Fragment的数据恢复3.数据如何存储和恢复三、参考文章一、页面销毁和重建1.页面销毁Android的页面销毁可以分两种,正常的销毁和非正常的销毁。在正常的销毁情况下,页面的状态信息被丢弃,不会被重建,比如调用了activit......原创 2019-06-04 20:43:25 · 6392 阅读 · 3 评论 -
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 · 947 阅读 · 1 评论 -
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 · 923 阅读 · 0 评论 -
(未完)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 · 255 阅读 · 0 评论 -
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 · 406 阅读 · 0 评论 -
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 · 227 阅读 · 0 评论 -
RecyclerView优化总结
一、铺垫1.RecycleBin先介绍一个简单的复用池实现,它通过SparseArray类型的缓存变量实现,注意它并不是线程安全的,只能在UI线程中使用。public class RecycleBin<T> { private final SparseArray<Queue<T>> map; public RecycleBin() { ...原创 2019-09-26 17:58:30 · 1343 阅读 · 3 评论 -
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 · 383 阅读 · 0 评论 -
xml布局中系统View标签为何不需要带包名
一、引子在xml文件中,如果想使用TextView、WebView、Button、RelativeLayout等系统View,直接写类名即可,但如果是自定义的View,则需要写带有包名的全类名,否则运行时会报错。这是为什么呢?二、查找原因我们知道xml文件都是通过LayoutInflater.inflate()方法解析的,我们从这个方法找下答案: public View inflat...原创 2019-10-09 21:02:16 · 461 阅读 · 0 评论 -
说一说Glide.with()
一、引子 Glide框架是google推荐的Android图片加载框架,使用起来非常轻便,比如以下代码就可以实现在fragment内,以fitCenter方式加载图片,未加载成功前显示placeholder。```javaGlide.with(fragment) .load(myUrl) .placeholder(placeholder) .fitCente...原创 2019-02-26 18:17:12 · 13453 阅读 · 0 评论 -
Matrix框架慢函数检测和分析
一、引子 Matrix 是一款微信研发并日常使用的 APM(Application Performance Manage),当前主要运行在 Android 平台上。Matrix 当前监控范围包括:应用安装包大小,帧率变化,启动耗时,卡顿,慢方法,SQLite 操作优化,文件读写,内存泄漏等等。 本文主要介绍下对于慢函数的监控。二、使用方法1.在项目根目录下的 gradle.prope...原创 2019-03-01 15:51:25 · 4587 阅读 · 0 评论 -
Fragment getActivity()返回null
Fragment getActivity() null AsyncHttpClient 异步请求原创 2016-04-05 15:55:58 · 1725 阅读 · 0 评论 -
AsyncHttpClient执行流程简单总结
AsyncHttpClient Request AsyncHttpReponseHandler原创 2016-01-29 14:06:05 · 3470 阅读 · 0 评论 -
判断当前手势下滑上滑
判断当前手势是上滑还是下滑1.定义全局变量 sumDy 和dy2.DispatchTouchEvent()中的move事件中更新dy和sumdy值dy = py - cy;//py为上次触碰事件y值,cy为当前触碰事件中y值py = cy;sumdy += dy;if(sumdy * dy sumdy = dy;}3.up事件中sumdy原创 2016-03-10 15:31:24 · 1939 阅读 · 0 评论 -
activity启动卡顿问题
切换页面卡断问题问题:由于项目需求经常变动,使用Activity包含Fragment来实现,在Activity的onCreate中创建加载Fragment。这种实现在性能差的手机上,启动新页面切换缓慢,经常出现用户点击按钮后,2-3s后才出现新页面。分析:使用TraceView发现,在性能差的手机上,Fragment的创建添加操作需要耗时0.6s;考虑当前是在Activity的onCr原创 2016-03-09 12:03:38 · 4451 阅读 · 0 评论 -
“同时”启动两个Activity
Activity1“同时”启动Activity2 Activity3,这个过程中Activity栈的结构是如何变化的?Intent intent = new Intent(this, MyActivity2.class);startActivity(intent);Intent intent2 = new Intent(this, MyActivity3.class);startActiv原创 2016-02-23 14:22:16 · 7129 阅读 · 1 评论 -
PullToRefreshListView总结
PullToRefreshListView工作原理:整体是个LinearLayout,包含一个Header,一个Footer,中间夹着一个ListView,其中Header和Footer的位置居于不可见范围内。以竖向下拉为例,当接收到下拉手势时,如果ListView内容居于置顶位置,则LinearLayout向下滚动,显示出Header的内容,当Header内容展示完全后,如果用户原创 2016-03-02 20:16:28 · 1602 阅读 · 0 评论 -
Activity和Fragment生命周期
一、Activity中有Fragment,打开和关闭生命周期打开再按Home键再打开二、Activity中有Fragment,Activity2中有Fragment2,打开Activity又打开Activity2,再关闭acitivity2如果以Activity2以dialog的形式出现再消失原创 2016-02-01 11:39:11 · 671 阅读 · 0 评论 -
创建app快捷方式
Intent shortcutintent = new Intent( "com.android.launcher.action.INSTALL_SHORTCUT");// 不允许重复创建shortcutintent.putExtra("duplicate", false);// 需要实现的名称shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_N原创 2016-02-18 15:19:39 · 1442 阅读 · 0 评论 -
Fragment add、remove、delete、show、hide源代码阅读
Fragment add 、remove 、replace、show、hide原理FragmentManager FragmentTransaction FragmentManagerImplBackStackRecord(1)Activity的getFragmentManager()方法public FragmentManager getFragmentManager()原创 2016-02-16 17:32:43 · 1282 阅读 · 0 评论 -
CyclicBarrier
A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fixed sized party of threads that must转载 2016-02-16 14:50:44 · 654 阅读 · 0 评论 -
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 · 947 阅读 · 0 评论 -
一个nullPointer bug的修复
变量要初始化断点设置状态变迁原创 2016-04-07 16:07:23 · 1139 阅读 · 0 评论 -
RxJava防重复点击原理
(代码基于rxbinding-1.0.1)使用RxJava实现View防重复点击功能比较简单fun View.noDoubleClick(action: Action1&amp;amp;lt;Void&amp;amp;gt;) { @Suppress(&amp;quot;DEPRECATION&amp;quot;) RxView.clicks(this) .throttleFirst(400原创 2019-02-28 15:09:14 · 2956 阅读 · 0 评论 -
一次ThreadPoolExecutor中maximumPoolSize误用
之前对于ThreadPoolExecutor的几个参数corePoolSize,maximumPoolSize,keepAliveTime,BlockingQueue的理解是:corePoolSize:核心线程数maximumPoolSize:线程池最大线程数,包括coreThread,所以应大于等于corePoolSizekeepAliveTime:允许存活时间,线程池是为了...原创 2018-12-29 18:41:28 · 4205 阅读 · 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 · 2169 阅读 · 0 评论 -
Android软引用(SoftReference)与LruCache
android缓存实现弱引用实现缓存在android中并不可靠转载 2017-12-06 14:54:29 · 422 阅读 · 0 评论