- 博客(24)
- 收藏
- 关注
原创 微信小程序
微信小程序还在测试阶段,网上有IDE(微信web开发者工具)的破解版,可以在没有AppID情况下进行小程序开发,官方最新版本的IDE(v0.10.101100)也已经支持无AppID配置下开发,相信离正式开放不远了。项目结构 其实小程序的项目结构除了app级文件外并没有太多强制要求,引用时通常文件路径正确即可。app级文件app.json用来声明程序配置;app.wxss可以定义全局通用样式;
2016-10-13 16:06:46 2339
原创 Weex尝鲜
Weex是阿里开源的类React Native技术,其实按知乎上的讨论基本可以说是整合Vue.js+React Native造的轮子(如何看待阿里无线前端发布的Weex?)。Weex是一款轻量级的移动端跨平台动态性技术解决方案,主要致力于使用Web方式开发出Native性能的App。Weex学习成本较RN相对较低, 可以说就是使用简易版的HTML/CSS/JavaScript以及自定义的一些组件和规
2016-07-08 10:25:10 4856
原创 Android内存泄漏分析
1、前言最近在fix 其他需求bug过程中,居然出现了OOM,程序直接挂了。第一反应是内存泄漏了,于是便开始查找原因。2、现象首先需要确定是不是内存泄漏,Android Studio的Memory监控(Android Monitors-> Memory)可以很好的呈现问题。 第一次打开app时,内存占用在20m左右。连续多次关闭再打开操作,内存占用达到了90m左右,并且点击initiate GC(
2016-05-16 15:10:07 537
原创 ButterKnife弃坑脚本
背景ButterKnife虽然帮助我们省去了繁琐的findViewById(),使用起来非常的快捷方便,但是有利必然也有弊,ButterKnife在编译期间会额外生成class文件,对App的方法数增加贡献不小,并且在library module中使用ButterKnife有着诸多不便,因此项目优化弃坑ButterKnife势在必行。脚本说明(1)解析@BindView注解得到view id...
2018-11-08 10:08:35 332
原创 Glide接入
1、Glide的生命周期绑定Glide.with()方法可以传入Context、Activity、Fragment等类型参数,Glide会根据传入参数的不同绑定不同的生命周期。因此,如果没有特定的需求,尽量传入Activity或者Fragment参数,这样Glide请求会在合适的时机释放资源。值得注意的是,如果在非主线程下,不管传入什么参数,Glide默认会取ApplicationContex...
2018-02-11 14:48:32 817
原创 ImageLoader.loadImage()同时加载相同url失败分析
现象 多处同时调用loadImage方法加载相同url,可能会导致部分调用失效,即图片加载不出来。比较普遍的场景是在Adapter的ViewHolder中加载相同的url。ImageLoader相关log如下:07-02 17:14:22.754 30344-30486/ D/ImageLoader: ImageAware is reused for another image. Tas...
2018-02-09 15:18:01 1560
原创 View事件分发机制
view事件分发机制是Android知识的难点也是重点,想要实现view的嵌套滑动、滑动菜单等酷炫功能都得先掌握好事件分发机制。View的事件分发机制主要涉及到dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法。public boolean dispatchTouchEvent(MotionEvent event)负责分发触摸事件至目标
2017-01-17 10:58:22 355
原创 关于miui6.0动态权限适配
android 6.0增加了runtime permission机制,但是其实miui在android 6.0发布之前就已经有了一套类似的权限管理机制,可以说是miui的一大特色吧。用户可以在应用的权限管理页面对权限进行设置,应用程序在执行需要权限的代码时,系统会自动判断权限,如果没有权限会弹出权限申请框或者toast提示,提示用户授予权限才能正常使用应用功能。miui的这套权限管理机制是在sdk
2016-09-18 14:42:20 2232 2
原创 Gradle之android配置
相信现在已经很少有公司android开发还用着Eclipse了吧,绝大部分都已经跟上潮流换上了Android Studio,AS默认使用Gradle作为项目构建工具。Gradle非常强大,可以方便我们做很多事情,例如: (1)方便我们复用代码和资源 (2)方便我们使用相同的代码和资源构建出不同的应用 (3)方便我们配置项目构建流程,甚至是加入自定义逻辑 默认情况下build.gradle是这
2016-08-03 10:27:58 339
原创 优雅的使用abstract
1、abstract介绍Java的abstract关键字可以修饰方法,也可以直接修饰类。当我们父类不关心某个方法具体实现时,可以使用abstract修饰该方法,使其成为虚方法。虚方法没有方法体,不需要实现,只需要声明即可。包含虚方法的类称为虚类,虚类也必须使用abstract关键字修饰。虚类除了不可以直接实例化,几乎和普通类没什么区别。继承虚类的子类,必须通过复写实现父类所有的虚方法,或者实现父类部
2016-07-24 19:57:36 341
原创 截屏事件监听实现
现在很多app都有监听截屏的功能,可以提示用户分享或者发送截屏图片,进一步提升app的用户体验。例如,微信在截屏后,点击输入框+号,会提示发送刚才的截屏图片,非常方便实用。其实,微信不光对截屏的图片进行了监听,你的手机sdcard里的大部分目录下新增图片时,都会被监听到。比如,你可以直接复制一张相册里的图片,微信也会提示。之前以为微信只是监听了系统截屏时发送的广播,然而查了文档并没有发现任何截屏类的
2016-07-03 13:14:24 4854
原创 Multidex何弃疗
当我们的app越来越大时,project build时可能会失败,报下面的错误。Conversion to Dalvik format failed:Unable to execute dex: method ID not in [0, 0xffff]: 65536或者是这样:trouble writing output:Too many field references: 131000; max is 65536.
2016-06-28 18:27:44 524
原创 layout中引用后定义的控件id不报错?
1、问题最近写layout时遇到一个奇怪的问题,layout布局中有两个控件属性都引用了在其后定义的控件id,编译时其中一个报id找不到,但是另一个却没有报错,而且布局显示都正常。布局layout大致如下:<TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_h
2016-06-06 18:32:43 1362
原创 Android性能优化
使用LocalBroadcastManager使用Context的registerReceiver和sendBroadCast注册发送广播是全局范围的,或者说是整个系统范围的,而LocalBroadcastManager限定只在我们的app进程中,不用担心广播发送的数据往外泄露,同时外部应用也无法通过广播调起我们的app,因此更加安全。convertView复用如果使用ListView或者Gr
2016-06-01 09:56:05 408
原创 Scroller真的能滚吗?
View的scrollTo或者scrollBy方法可以将View内容滚动到指定位置,但是两者都是瞬时完成的,没有过渡动作。为了提升用户体验,有时我们希望可以实现view平滑的滚动,这时Scroller就派上用场了。其实Scroller本身并不能滚动View,通常需要跟View的computeScroll配合使用才能发挥作用。例如我们自定义Layout:public class ScrollerTes
2016-05-24 16:59:40 576
原创 Java设计模式之单例模式
1、使用场景所谓单例模式,就是只可能存在唯一一个类的实例,不能再多了。单例模式可以说是Java设计模式中最简单但也是最常用的一种了。在Android开发中也同样如此,当App需要一个全局的、跟Application同生命周期的服务或者需要统一管理调度某种资源等情况,我们通常会编写一个单例实现的类,达到统一资源服务入口的目的,同时也可以减少不必要的资源开销,提升App性能。Android源码中,也有很
2016-05-23 16:33:01 300
原创 Trick of clipToPadding
1、问题使用ListView、GridView、RecyclerView等ViewGroup时,经常会需要设置上下左右的边距,但是在列表滚动时,边距始终存在,item不能出现在边距范围内,使得页面不太美观。2、目标去除ListView、GridView、RecyclerView等控件滑动时,上下存在的边距,提升用户体验。3、解决(1)首先能想到的解决方案是在各个item布局中去设置边距,这样滑动时,
2016-05-18 17:01:27 378
原创 与ListView不同,RecyclerView的嵌套解决
1、问题ListView的item中嵌套了RecyclerView实现水平方向列表,导致RecyclerView高度不能正常显示。2、传统解决方案嵌套问题最基本的解决方法是重写onMeasure方法,手动测量ViewGroup的高度或者宽度。这里,因为我们的RecyclerView是水平的,而且每一个item的高度是相同的,所以只需要测出一个item的所占用高度(包括父控件的上下padding以及i
2016-05-16 15:48:29 5832 1
原创 RxJava 小试
1、基本概念官方wiki这样介绍: RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.翻译:RxJava是ReactiveX的
2016-05-16 14:26:22 433
原创 有趣的ViewPager
1、缘来最近看到一个比较有意思的功能,看着像ViewPager的翻页,又像HorizontalScrollview的滑动。如下图所示: 联想到项目中刚做的一个类似的水平滑动,可以借鉴下,如果每次滑动都可以对齐图片边界,用户体验会不会更好点呢?2、实现毫无疑问,使用HorizontalScrollview肯定可以实现这样的功能,但是想一下应该需要处理一系列的触摸事件,判断滑动距离,自己去做图片边
2016-05-16 11:36:23 493
原创 你可能不知道的ListView Recycler机制
1、问题引出 项目中使用的listview拥有多个不同类型的item,而且有些item数量只有一个,之前以为滑动时view无法复用。 2、分析 说到ListView的View复用,先来一张经典的原理解析图。 从图中可以看出,当listview某一item完全滑出屏幕时,内部的一个Recycler容器会缓存这个item。当listview新的一项需要在屏幕上展示时,这项缓存的item会在g
2016-05-16 11:24:18 569
原创 Android DataBinding
0、前言Android传统框架中,Activity承载了太多的任务,业务逻辑的处理、view逻辑处理等等都写在Activity中,代码过于臃肿耦合。Fragment出现后,臃肿情况稍微好转一点,毕竟代码大都迁移到了Fragment中。我们可以对Fragment再次进行分块,进一步降低代码臃肿现象,但是代码耦合的现象仍然无法得以解决。
2016-05-16 11:08:14 1175
原创 Activity启动模式
1、LaunchModestandard(标准模式)Activity的默认启动模式,每次startActivity都会重新创建一个Activity实例,不管之前是否已经存在该Activity实例。被启动的Activity实例会进入到启动它的Activity所属的任务栈中。singleTop(栈顶复用模式)如果待启动Activity在当前任务栈存在实例,并且实例位于栈顶,则启动Activity
2016-05-16 10:56:24 297
原创 ViewPager缓存策略
项目中使用TabHost+ViewPager实现横划切换和顶部Tab导航切换。总共有三个Tab Fragment,发现从Tab1切换到Tab2时,不是非常流畅,而从Tab2切换回Tab1却没有问题。同样在Tab3切换到Tab2时也会卡一下。最后发现是ViewPager自带的缓存策略引起的。ViewPager定义了一个私有属性来保存当前缓存Page个数,默认为1(其实是左右两边各一个,后边会解释)。p
2015-09-25 15:04:12 1385
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人