当前位置: 首页 > news >正文

网站怎么申请网站建设网站排行

网站怎么申请,网站建设网站排行,网站怎么做电脑系统下载文件,android网站开发实例这篇文章是我的朋友小二哥写的#xff0c;他解决了一个问题并提交了一个补丁给google合入#xff0c;当然了#xff0c;这也是他第一次提交补丁被google采纳。我觉得这才是做技术的样子#xff0c;二哥也很喜欢篮球#xff0c;#xff0c;为二哥吹一波。哈哈。关于这次补… 这篇文章是我的朋友小二哥写的他解决了一个问题并提交了一个补丁给google合入当然了这也是他第一次提交补丁被google采纳。我觉得这才是做技术的样子二哥也很喜欢篮球为二哥吹一波。哈哈。关于这次补丁的提交如下文喜欢的同学可以好好看看。背景在一个已经加载完成很长的微信聊天记录中持续不断的滑动慢慢的微信会越滑越卡。一、卡顿的原因分析Choreographer#doFrame的animation中会堆积大量的Callback-AbsListView#FlingRunnable从而导致了最后这一帧的绘制超时导致了卡顿。二、FlingRunnable堆积的原因一次滑动会触发一个Down事件多个Move事件一个Up事件。从下图可以发现这次滑动导致animation的FlingRunnable从3个增加到了4个看看这4个是怎么来的3个是来自于之前的FlingRunnable新增的一个来自于Up事件触发的。三、代码分析3.1 onTouchDownTouch Down事件会触发mFlingRunnable.flywheelTouch() private void onTouchDown(MotionEvent ev) {...if (mTouchMode TOUCH_MODE_OVERFLING) {...} else {...if (!mDataChanged) { //ListView的数据没有更新if (mTouchMode TOUCH_MODE_FLING) {//ListView处于Fling的状态// Stopped a fling. It is a scroll.createScrollingCache();mTouchMode TOUCH_MODE_SCROLL;mMotionCorrection 0;motionPosition findMotionRow(y);mFlingRunnable.flywheelTouch();//跳转到3.1.1... 3.1.1 mFlingRunnable.flywheelTouchflywheelTouch会postdelay一个mCheckFlywheel延迟40ms。当mCheckFlywheel被执行的时候会去判断ListView当前的滑动速度。如果Math.abs(yvel) mMinimumVelocity将会再次postdelay一个mCheckFlywheel让ListView继续滑动一段时间。如果Math.abs(yvel) mMinimumVelocity将会endFling()这就是为什么ListView滑动之后慢慢停止的逻辑。endFling中将会removeCallbacks(this)和removeCallbacks(mCheckFlywheel) private static final int FLYWHEEL_TIMEOUT 40; // millisecondsvoid flywheelTouch() {postDelayed(mCheckFlywheel, FLYWHEEL_TIMEOUT);}private final Runnable mCheckFlywheel new Runnable() {Overridepublic void run() {...if (Math.abs(yvel) mMinimumVelocity scroller.isScrollingInDirection(0, yvel)) {// Keep the fling alive a little longer//yvel mMinimumVelocity继续滑动将mCheckFlywheel在推迟40mspostDelayed(this, FLYWHEEL_TIMEOUT);} else {endFling();mTouchMode TOUCH_MODE_SCROLL;reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);}}};void endFling() {...removeCallbacks(this);removeCallbacks(mCheckFlywheel);...} 3.2 onTouchUp在onTouchUp中将会执行mFlingRunnable.start(-initialVelocity)从而postOnAnimation(this); private void onTouchUp(MotionEvent ev) {switch (mTouchMode) {...case TOUCH_MODE_SCROLL:...if (!dispatchNestedPreFling(0, -initialVelocity)) {if (mFlingRunnable null) {mFlingRunnable new FlingRunnable();}reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);mFlingRunnable.start(-initialVelocity);//跳到下面的start方法dispatchNestedFling(0, -initialVelocity, true);} else {mTouchMode TOUCH_MODE_REST;reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);}...}void start(int initialVelocity) {...postOnAnimation(this);...} 3.3 FlingRunnable#runFlingRunnable的run方法如果ListView处于TOUCH_MODE_SCROLL或者TOUCH_MODE_FLING的状态并且还有更多的内容就会继续postOnAnimation(this)Override public void run() {switch (mTouchMode) {default:endFling();return;case TOUCH_MODE_SCROLL:if (mScroller.isFinished()) {return;}// Fall throughcase TOUCH_MODE_FLING: {...if (more !atEnd) {if (atEdge) invalidate();mLastFlingY y;postOnAnimation(this);} else {...}break;}...} } 小结onTouchDown会postdelay 40ms一个mCheckFlywheelmCheckFlywheel将会检查ListView是否应该停止onTouchUp会postOnAnimation(FlingRunnable)让ListView开始Fling起来。每一个FlingRunnable又会再次触发一个postOnAnimation(FlingRunnable)。四、对比分析4.1 为什么Google Pixel不存在这个BUG原来Google Pixel每次滑动Down和Move事件的间隔绝大多数情况下大于40ms从而导致mCheckFlywheel中endFling可以在持续的滑动中被有效的执行这样子就不会导致FlingRunnable的堆积4.2 为什么我们的手机会存在这个BUG原来我们的手机TP采样率比较高接近180hzDown和Move的时间间隔竟然在9ms左右从而导致了mCheckFlywheel永远被postdelay无法有效的执行endFling这样子就导致了FlingRunnable的堆积五、解决方案在FlingRunnable.start中调用postOnAnimation之前removeCallbacks(this)避免FlingRunnable的堆积这个方案已经被merge进了Android官方主分支中https://android-review.googlesource.com/c/platform/frameworks/base//1645426void start(int initialVelocity) {int initialY initialVelocity 0 ? Integer.MAX_VALUE : 0;mLastFlingY initialY;mScroller.setInterpolator(null);mScroller.fling(0, initialY, 0, initialVelocity,0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);mTouchMode TOUCH_MODE_FLING;mSuppressIdleStateChangeCall false;removeCallbacks(this);//修复的patchpostOnAnimation(this);if (PROFILE_FLINGING) {if (!mFlingProfilingStarted) {Debug.startMethodTracing(AbsListViewFling);mFlingProfilingStarted true;}}if (mFlingStrictSpan null) {mFlingStrictSpan StrictMode.enterCriticalSpan(AbsListView-fling);} } 总结这是我作为android工程师第一次成功提交代码到Android官方主分支还是值得纪念的可惜提交的账户不是我自己的而是公司账户因为自己的账户很有可能Google工程师不会review你的提交。有了一次就会有第二次期待我下次继续为Android开源代码贡献代码。推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~
http://www.huolong8.cn/news/140251/

相关文章:

  • 镇江网站定制2022中国企业500强
  • 做ppt好的模板下载网站公众号做视频网站
  • 做一个介绍网站多少钱dw怎么做连接到另外一个网站
  • 河南省建设部省厅网站手机+显示器自适应wordpress+主题
  • 网站开发的基本流程文库建设网站平台合同范本
  • wordpress网站无法登陆网站建设灬金手指下拉
  • 网站上有声的文章是怎么做的个人邮箱登录登录入口
  • 安庆做网站电话在线证件照生成器
  • 网站开发用什么软件开发南宁网站建设产品
  • 做网站 报价 需要了解求个网址老哥们2021
  • 国际空间站vs中国空间站类似知乎可以做推广的网站
  • 做手机网站网站建设的总结
  • 福建建设银行网站百度域名是什么意思
  • 货源网站辅助网站建设
  • 深圳网站建设民治大道做网站的用多少钱
  • 建设网站的工作流程专门做调查的网站
  • 网站后台无编辑器单页网站建站
  • 淘宝做导航网站有哪些功能自学网站建设哪个网站好
  • 网站营销策划公司不用服务器做网站
  • 黄岛建设厅官方网站商城网站建设价格费用
  • 西宁网站设计高端预付网站建设费会计处理
  • 为什么做织梦网站时图片出不来技术号的网站建设
  • 新公司做网站怎么弄成都微信网站建设推
  • 公司网站制作应该注意些什么做公司网站需要了解哪些东西
  • 医院可以做网站吗新网网站备案流程
  • 抢先注册网站域名卖掉网页设计的岗位叫什么
  • 做耳机套的网站wordpress标签聚合美化
  • 个人网站一年多少钱功能型网页设计
  • 那个网站可教做课件好广东seo加盟
  • 寄生虫网站怎么做destoon 网站后台显示不出模板