项目A 1.0优化总结
来源:互联网 发布:将军岂愿见之乎 编辑:程序博客网 时间:2024/06/05 11:58
一:把折叠效果换成只有滑动到服务顶部再下滑才让顶部分类显示出来
mRecyclerView.getLocationOnScreen(location);Logger.e("onScrollStateChanged----------------》Screen x is " + location[0] + " Screen y is " + location[1]);if (location[1] == COMPLETELY_STRETCH_HEIGHT) { mRefreshLayout.setPullDownRefreshEnable(true);} else { mRefreshLayout.setPullDownRefreshEnable(false);}
二:优化要求:在快速滑动时(不是手一拖一拖的那种,而是手指离开后的滑动,即SCROLL_STATE_SETTLING)不加载图片,停下来才加载
解决办法:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //方案一:滑动时(指SCROLL_STATE_SETTLING状态下)暂停in progress的加载否则恢复加载, // Glide不支持暂停或恢复单个request的加载要么暂停所有,要么恢复所有 if (newState == RecyclerView.SCROLL_STATE_SETTLING) { requestManager.pauseRequests(); } else { requestManager.resumeRequests();//恢复加载时会加载R个item(R为用来复用的item个数) } //方案二:每次不滑动时只加载屏幕可见的item 比方案一更省流量, // 假设一屏容纳V个item,那么每次停下时少加载R-V个item图片 if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_DRAGGING) { loadVisibleItemImage(); }
@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); Logger.e("onScrolled---------------->"); //下面为方案二所需代码 lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
private void loadVisibleItemImage() { for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) { ServiceView serviceView = (ServiceView) mRecyclerView.findViewWithTag(i);//onBindViewHolder里面进行的setTag if (serviceView != null) serviceView.setCover();// Logger.e("current serviceView is " + serviceView); } }
方案一中之所以滑动时停止所有加载,停下来后恢复加载可以节省流量(这里加载完所有图的所需总流量没变,是指快速滑动到某位置前不会加载从而消耗没必要的流量),是因为停下来后,加载的最多也就N个item(N为用于复用的原始item个数)
而滑动时加载虽然加载的对象也是那N个,但是那N个是在不停加载的,只不过不停切换Url而已(网速好的情况下基本下滑的同时对应position的图已加载好),所以消耗的流量很大。
对于已加载好但滑过去了然后滑回来发现会有重新“加载”现象:即由先展示默认placeholder然后再变成应有的图片,这其实重新加载是必然的因为view是复用的(不信看微信朋友圈也有),之所以修改前不明显,那是因为之前滑动时可以加载,而且此时滑回去加载的是缓存所以速度极快,几乎看不到,而修改后滑动时不可加载,所以滑动时看到的是默认图片,只有停下来才开始加载缓存,这也是为何滑回去的话,虽然看似再次加载,却不耗流量的!!!!!!!(流量监测app可证明)
主页耗流量原因:之前人写的代码设置头像时上传的url就是原始图,而不是小图,所以主页头像是原始图,另外普通动态图虽然是显示的压缩图,但是相比微信我们的压缩图还很大,加之之前滑动时仍然加载,所以不断滑动翻页结果就发现流量飞跑!!!!!!!!!!!!!!!!!
1.获取View在屏幕中的位置使用view.getLocationOnScreen()或者getLocationInWindow()
2.对于可滑动的View(RecyclerView ,ListView,ScrollView),如果设置了滑动监听,那么初始化显示时会回调onScrolled(),不过不会回调onScrollStateChanged().不过前提是
其其自身宽/高要大于屏幕,否则即使用手去拖动onScrolled()也不会回调,即只有它能真正滑动时onScrolled()才会回调,不过它不能滑动时如果用手去拖还是会回调onScrollStateChanged()而且还会监听到完整的三种状态:DRAG,SETTLING,IDLE.(不过要注意拖动方向必须是由其头部指向尾部方向)
3.使用recyclerView.canScrollVertically(1/-1) canScrollHorizontally(1/-1)来判断RecyclerView是否滑动到底部/顶部
RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
4.View的Visibility (VISIBILE,INVISIBILE,GONE) :View.getVisibility ==VISIBILE时并不一定 view对用户可见,例如:本次项目中放在CoordinateLayout中的顶部分类的RecyclerView 随着上滑退出屏幕后此时判断其Visibility仍然是VISIBILE。正如其语义——可见性,当为VISIBILE时只说明是可以被看见的,但是有时候可能被遮挡!
mContentView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { Rect rect = new Rect(); boolean isShown =mCategoryList.getGlobalVisibleRect(rect);// Logger.e("content view onScrollChanged width is "+isShown+mCategoryList.getMeasuredWidth()+"\nheight is "+mCategoryList.getMeasuredHeight()+"\n rect width is "+rect.width()+"\n rect height is"+rect.height()); if(isShown){ EventBus.getDefault().post("1"); }else { EventBus.getDefault().post("0"); } } });// mContentView.setOnScrollChangeListener(new View.OnScrollChangeListener() {// @Override// public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {// Logger.e("content view onScrollChanged");// }// });
@Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility);// if(visibility==View.VISIBLE){// Logger.e("onWindowVisibilityChanged-------->可见"+this);// }else if(visibility == INVISIBLE || visibility==GONE){// Logger.e("onWindowVisibilityChanged-------->不可见"+this);// } }
- 项目A 1.0优化总结
- 【Javascript】项目优化总结
- JavaScript 项目优化总结
- [JavaScript]项目优化总结
- [JavaScript]项目优化总结
- 项目优化总结
- mr项目优化总结
- 项目优化总结
- 使用NGUI项目优化总结
- 项目总结之优化游戏包大小
- 个人项目优化小细节总结
- 「S-A-L-T-A」项目失败总结!
- MetaQ (RocketMQ) 小包消息优化项目中期总结
- Android 签名机制,项目签名,ANT打包,优化,发布总结
- 项目中Angularjs遇到的问题和优化总结
- Android 项目总结 ViewPager Indicator fragment内存优化过程
- 项目中Angularjs遇到的问题和优化总结
- 项目中Angularjs遇到的问题和优化总结
- springMVC整合dubbo+zookeeper
- $.extend()方法和(function($){...})(jQuery)详解
- libsvm MATLAB 版本安装
- mycat1.6+mysql(MariaDB 10.1)丢失插入数据
- 顶点、 图元、片元、像素的含义
- 项目A 1.0优化总结
- Linux Kernel(Android) 加密算法总结(三)-应用程序调用内核加密算法接口
- Linux目录结构
- WinFrom快速开发OutLook框架多皮肤经典样式CMS
- jQuery Mobile总结(初级)
- JMeter调试工具---Debug Sampler
- 核心转储(core dumps)
- iOS UIView背景色渐变
- 手把手教你cuda5.5与VS2010的编译环境搭建