alwaystest

Results 88 issues of alwaystest

# Android 动画 标签(空格分隔): Android Transition Animator --- 好多App都使用了SharedElementTransition来处理页面跳转,两个页面之间平滑过渡效果还是很漂亮的。 看了好多讲使用TransitionManager来开启动画的文章,其中讲`TransitionManager.beginDelayedTransition`的时候,说到: > 在下一次绘制时,系统会自动对比之前保存的视图树,然后执行一步动画。 怎么样就是在下一次绘制时呢?万一下次绘制的时候对View的操作没有执行完呢?其实有点想多了,Android的绘制屏幕和对UI的更改只能在主线程,对View的修改操作没有完成,当然是不可能运行到绘制阶段的呀。 [Android transitions 如何工作](https://www.zybuluo.com/flyouting/note/6269)讲的很清楚: > TransitionManager通过添加一个[OnPreDrawListener](http://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html)来等待下一个渲染帧[code](https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/android/transition/TransitionManager.java#L250) --- 另一个常用来控制动画的是`Animator`。 初学者自己定义动画的时候可能会递归调用`handler.postDelayed`修改某个属性,造成动画的假象,这样是不合适的,一个是时间不好控制,另一个是流畅性不好保证。 这个时候可以使用`ValueAnimator`来进行动画控制。 `ValueAnimator`添加了一个`AnimatorUpdateListener`: > This method is called on all...

# GitLab CI与Docker,License更新问题 标签(空格分隔): CI 持续集成 Android License --- 之前一直正常使用的CI环境突然报错,提示如下: > You have not accepted the license agreements of the following SDK components [Android Support Repository]. 很奇怪,之前项目中也引用了Support包,一直没有报错,怎么突然就报错了。 检查之后发现,项目新加的一个第三方依赖依赖了`SupportXXX:25.0.0`,而项目中之前依赖的是`SupportXXX:24.X.X`,而构建Docker镜像的时候`Support25`包还没有出来,容器中使用的是24的版本,根据[这里](http://stackoverflow.com/questions/38096225/automatically-accept-all-sdk-licenceshttp://stackoverflow.com/questions/38096225/automatically-accept-all-sdk-licences)说Gradle会尝试下载依赖,但是License是Gradle没有解决掉的。所以这里就报错说没有接受SDK的License。 Android官方没有对命令行使用SDK管理工具进行详细的说明,查到有一个网页文档是过期了的,自动跳转到了最新的文档中,只说明了使用GUI更新SDK。 StackOverflow上说更新Support库的命令是...

# 树莓派Docker运行Aria2引发的一系列折腾 标签(空格分隔): 树莓派 RaspberryPi Docker Aria2 电信 UPNP NAT E-140W-P --- 这段时间用树莓派用的有点烦,因为之前用的wheezy,软件源里面好多软件都很旧了,搭建的 Aria2下载器是自己编译过的新版,最近想到树莓派上折腾Docker,发现需要升级升级系统到jessie,本来想无痛升级,使用`rpi-update`这个命令,[参考这里的文章](https://www.rpicn.org/documentation/raspbian/updating-md/)。但是发现升级完还是wheezy的系统, 难道是我没有理解内核和固件这两个名词?固件不是系统吗?求指教。 `rpi-update`不管用了,果断格式化重刷系统。心疼我下载的权利的游戏第六季一秒钟。 Win10的系统好像已经不能使用win32diskimager这个软件来烧录SD卡了,我这里打开报了一个错,但是还能开始运行,烧录到一半软件崩溃掉了。幸亏我还有一个万能PE,进入PE里面的便携版Linux系统,`dd`命令完事。 我的树莓派的用途列个清单: 1. Python脚本自动签到两个论坛 2. Aria2自动下载 前端yaaw和web-ui都有 3. Samba文件共享 嗯,没别的了。虽然之前在树莓派上搭建过dnsmasq+ss-redir,但是感觉不是 很稳定,现在已经把方案放到路由器上实现了,用的是小米路由器MINI版刷机。系统用的[改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件(百度云同步 aria2...

# Kotlin中的静态方法 标签(空格分隔): Android Kotlin --- Kotlin取消了Java中的`static`关键字,转而使用`companion object`,然而这两个还不完全一样。 单元测试的时候由于有绕不过的`TextUtils`这个类,比较偷懒的话可以使用Robolectric来解决,但是Robolectric运行速度比较慢,而且也不是特别简单,所以在test文件夹下自己写一个`android.text.TextUtils`类还是有必要的。 本来直接用Java来写这个类就行,把SDK的源码复制一下就完事,但是前面立下了Flag,说单元测试使用Kotlin来编写,而Kotlin Plugin提供的一键转换居然不管用了,转过去的Kotlin类不能直接使用,还得先修改IDE报的错,然后再使用。 Kotlin使用`companion object`声明的方法可以在Kotlin类中直接通过类名调用,但是运行单元测试的时候会提示方法不存在。 查了半天,才发现Java类中调用这个方法还需要给方法添加`@JvmStatic`。 举个例子 ``` package android.text class TextUtils { companion object { @JvmStatic fun isEmpty(text: CharSequence?): Boolean {...

# Proguard报错Support库Duplicate zip entry问题 标签(空格分隔): Android Proguard --- 网上查的资料都只是说同时依赖了两个不同版本的Library。 但是[Android Studio(Gradle)解决库依赖冲突问题](http://www.mobibrw.com/2016/3777)中说Gradle会默认共享最高版本的依赖库,所以如果没有使用Jar方式来管理依赖的话,基本不会遇到这个问题。 查看错误日志,报错的类是`classes.jar:android/support/v4/util/MapCollections$ArrayIterator.class`。而使用`gradle -q app:dependencies`查看依赖,也确实发现低版本的`SupportV4`库被忽略而使用了依赖的最高版本的库。 > 在Android Support Library 24.2.0及之后的版本中,为了增强效率和减小APK的大小起见,Android将V4包从一个独立的依赖包拆分成v4 compat library、v4 core-utils library、v4 core-ui library、v4 media-compat library和v4 fragment library这5个包 文/张明云(简书作者)...

# 智能家具连接WIFI解决方案总结 标签(空格分隔): 智能家具 --- 公司最近加装了Airburg的新风系统。发现Airburg设置连接WIFI的方式非常神奇。 不需要装APP,不需要蓝牙。只要手机上关注微信公众号,在网页上调起一个原生界面,输入WIFI密码,Airburg就神奇的接收到了WIFI的SSID和密码并且连接上了。 刚开始我比较担心WIFI的安全问题,基于以下错误猜想,还开了个玩笑说Airburg和WIFI万能钥匙合作,收集WIFI密码。 本来我猜想是Airburg内部先装了一个SIM卡,手机关注微信公众号,绑定设备然后提交了SSID和WIFI密码,由服务器下发。这个想法当然是不靠谱的,硬件成本高,可靠性也不好。 如果是智能设备开一个热点,手机连上,访问智能设备的页面,提交表单,也不太像。因为没有看到明显的切换WIFI的动作,而且界面上直接把当前手机连接的SSID获取到了,所以没有切换热点。 后来注意到输入WIFI密码的界面好像是原生实现的,由于是微信公众号调用打开的,我不相信微信会单独给某个厂家定制界面。 蓝牙也没有打开的迹象。NFC更不用说了。 在网上搜索`Airburg连接WIFI`也找不到相关资料。 想到这个技术方案可能是通用的。于是搜索`智能设备连接WIFI方案`。终于找到了结果。 可以先在知乎看看[网友开脑洞的想法(拉到底,前面的答案还是靠谱的)](https://www.zhihu.com/question/30169474)。超声波次声波都出来了,不禁让我想起了支付宝的声波付款。 [小米的一个技术方案(需要切网络,用户体验不够丝滑)](https://www.zhihu.com/question/28355632) [WIFI快连的实现原理(技术分析,干货)](http://blog.csdn.net/sadshen/article/details/47049129) [一本正经的方案对比(太长不看系列)](http://www.bigertech.com/post/smart-device-connect/) ### 最终 [Airburg使用的方案,微信提供的AirKiss](http://iot.weixin.qq.com/wiki/new/index.html?page=4-1-1) --- 干技术的不能闷头钻研,偶尔抬头看看世界的变化,生活真美好。

# Android Studio 与 Gradle 标签(空格分隔): Android --- 网络不好,凸墙出不去。 Android Studio打开一个Clone的Android的项目的时候卡在了Building Project界面。 原来是后台在下载该编译该项目所需要的Gradle的版本,下不动。 Update: offline模式只是设定Gradle的工作状态是离线模式,而不是设定使用的项目使用离线的(local)gradle版本。所以设定offline应该是无效的。 正确的做法应该是挂全局代理加速。(这也应该是官方使用gradle wrapper的原因)这样也能保证项目无法编译不是由于gradle版本引起的。 如果AS默认下载速度太慢的话,可以手动下载zip包,放到指定的位置去让AS读取。 --- ~先设置Android Studio的全局Gradle为offline模式,使用安装Android Studio时自带的Gradle版本,或者自己指定一个手动安装了的本地Gradle。先进了项目。然后把项目的project-level settings 改为使用本地Gradle,关掉offline 模式。~ 如果Gradle版本导致不能编译此项目,只能安装对应版本的Gradle,把项目的project-level settings 改为使用默认Gradle Wrapper了。 OSX下Android...

# 继续说说Android的混淆 标签(空格分隔): Android --- 前段时间遇上了新问题,依赖的库太多,即使Proguard压缩了方法数,依然逼近64K大关。是时候再优化优化规则,挤点乳沟出来了,我就是不愿意开启MultiDex。 使用dexcount看看方法数占用。发现android开头的包下面占用最多,20K个方法。下面supoport包又占了大半,但是毕竟是android开头的包名啊,动手之前还是要查查有没有后台的。 想起来之前看到过Android混淆的文章提到过: > AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的; > 文/CPPAlien(简书作者) 原文链接:http://www.jianshu.com/p/7436a1a32891 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 我就引用下,原文连接也贴出来了,不要那么麻烦找授权了吧。 然后又找到郭霖大神的文章说: > 接着看一下MyFragment,这个类也是混淆的比较彻底的,基本没有任何保留。那有些朋友可能会有疑问,Fragment怎么说也算是系统组件吧,就算普通方法名被混淆了,至少像onCreateView()这样的生命周期方法不应该被混淆吧?其实生命周期方法会不会被混淆和我们使用Fragment的方式有关,比如在本项目中,我使用的是android.support.v4.app.Fragment,support-v4包下的,就连Fragment的源码都被一起混淆了,因此生命周期方法当然也不例外了。但如果你使用的是android.app.Fragment,这就是调用手机系统中预编译好的代码了,很明显我们的混淆无法影响到系统内置的代码,因此这种情况下onCreateView()方法名就不会被混淆,但其它的方法以及变量仍然会被混淆。 > http://blog.csdn.net/guolin_blog/article/details/50451259 那就开始下手吧。 首先把之前从网上粘的冗余规则删掉删掉! ``` -keep public class * extends android.app.Activity...

# Instant Run 和代码压缩 标签(空格分隔): Android --- 首先Instant Run是不会启动Proguard来做代码压缩的。 Android Plugin for Gradle V2.0 以上提供了一个叫`build-in shrinker`的东西来替代Proguard来做代码压缩。 `build-in shrinker` 是可以与Instant Run来协同合作压缩代码量(方法数)的。 https://developer.android.com/studio/run/index.html > 如果您的项目面向旧版 Dalvik 可执行文件分包(即,使用 multiDexEnabled true 和 minSdkVersion 20...

# Hello Kotlin 标签(空格分隔): Android --- Kotlin面世也有一段时间了,当年发布的时候我还忧心忡忡的感觉这么多年Java白学了,现在回头看还是Naive。 前段时间接触了C#,最近学习了RxJava,发现lambda的方便快捷。虽说有`Gradle Retrolambda Plugin`这样的扩展,但是我看到了扔物线[这样说](http://gank.io/post/560e15be2dca930e00da1083) > 如果你习惯使用 Retrolambda ,你也可以直接把代码写成上面这种简洁的形式。而如果你看到这里还不知道什么是 Retrolambda ,我不建议你现在就去学习它。原因有两点:1. Lambda 是把双刃剑,它让你的代码简洁的同时,降低了代码的可读性,因此同时学习 RxJava 和 Retrolambda 可能会让你忽略 RxJava 的一些技术细节;2. Retrolambda 是 Java 6/7 对 Lambda...