Hiten's Blog.

Hiten's Blog.

解惑requestDisallowInterceptTouchEvent

最近在看官方控件源码时,无意间看到某些代码,让我想起有很多用requestDisallowInterceptTouchEvent来解决ScrollView和ViewPager冲突的例子,包括任玉刚写的《Android开发艺术探索》一书也提到这种方式,但是关于requestDisallowInterceptTouchEvent,你真的了解了吗?

这是网上写的最多的用requestDisallowInterceptTouchEvent解决ScroolView相关的滑动冲突例子,确实是正确姿势;

1
2
3
4
5
6
7
8
9
10
11
publicbooleanonTouchEvent(MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_MOVE:
parent.requestDisallowInterceptTouchEvent(true);
break;
caseMotionEvent.ACTION_UP:
caseMotionEvent.ACTION_CANCEL:
parent.requestDisallowInterceptTouchEvent(false);
break;
}
}

Kotlin转Java记录

昨天写了一篇PermissionsDispatcher初探,文章最后说要用java重写processor模块,今天花了半天时间完成,现在把代码放在github上:https://github.com/ileelay/PermissionsDispatcher/tree/2.2.0j,欢迎大家纠正!同时感慨到Kotlin太强大,Java太繁琐;
虽然Kotlin语法很简练,终究还是基于JVM,同时这篇文章不是循序渐进的Kotlin语法讲解,只是为了记录在转PermissionsDispatcher时的粗略见解;

普通class

kotlin是这样子写的

1
class NoParametersAllowedException(e: ExecutableElement) : RuntimeException("Method '${e.simpleString()}()' must not have any parameters")

为了保持参数一致,我用java是这样写的:

1
2
3
4
5
6
7
8
9
10
11
public class NoParametersAllowedException extends RuntimeException {

public static RuntimeException getInstance(ExecutableElement e) {

return new NoParametersAllowedException("Method "+e.getSimpleName().toString()+" must not have any parameters");
}

private NoParametersAllowedException(String s) {
super(s);
}
}

初探Android6.0权限库PermissionsDispatcher

关于Android6.0运行时权限问题,大家应该不会陌生,这个坑我早就傻傻的跳进去过,说一个笑话,api23刚出来不久,在没搞清新特性之前,我就在项目中用上了,发到线上的包因为一个权限忘了判断而崩溃,后来紧急热修复,还特意写了一篇博客来总结,言归正传,那么这个PermissionsDispatcher什么东西;

PermissionsDispatcher是一个用注解方式来处理Android6.0运行时权限的库,旨在高效处理权限问题。

用它一张图

分享一个RecyclerView的click技巧

如何处理一个RecyclerView列表点击事件,在网上一般能搜到两种方案:

  • 从ViewHolder中得到rootView,然后进行setOnClickListener();

  • 实现RecyclerView.OnItemTouchListener接口,从Touch事件中分发出Click事件;

这两种解决方案在网上都有讲解,想了解更多的,可以参考这篇博客,我在实际开发中,更倾向于第一种方案,因为这种方案比较简单,但是每次还得在ViewHoler中写代码,很多时候点击事件的逻辑应该在activity中实现,这样还得定义用于回调的接口,然后从activity得到viewHoler对象,set事件,作为一个有洁癖的程序员,这是多么邋遢的写法,但更可耻的是,我竟然一直在默默接受了;

今天在闲逛国外大牛博客时,发现一种封装的技巧,也是基于view的setOnClickListener方法,但不是在viewHolder获取view;

先看看怎么调用:

OkHttp3中Interceptor的使用心得

在看到这篇文章时,希望你已经阅读过OkHttp对Interceptor的正式介绍,地址在这里,同时,你还可以知道okhttp-logging-interceptor这个辅助库,当然如果你没有阅读过也并无大碍,这篇文章重在描述使用场景和个人心得;

在去年网上讨论最多的就是OkHttp和Volley的比较,我当时决定把项目中的Volley换成OkHttp2,是因为在弱网环境下测试,OkHttp比较坚强,所以就用它了,并不是对Square的情怀;在一年多的使用中,不论是从2.x版本升到3.x,OkHttp绝对是最好用的库,特别是加之Retrofit,如虎添翼;

这篇文章是讲Interceptor的使用心得,这就根据我所用,总结出这么几点:

  • Log输出
  • 增加公共请求参数
  • 修改请求头
  • 加密请求参数
  • 服务器端错误码处理(时间戳异常为例)

这几点绝不是全面,但至少是目前很多开发者或多或少都会遇到的问题,Log输出是必须有的,公共参数这是必须有的,请求头加密和参数加密,这个不一定都有;重点是服务端错误码处理,这个放在哪里处理,见仁见智,但是有些比较恶心的错误,比如时间戳异常(请求任何一个服务器接口时必须携带时间戳参数,服务器专门有提供时间戳的接口,这个时间戳要和服务器时间戳同步,容错在5秒,否则就返回时间戳错误),比如客户端修改系统时间时这一刻又断网了,监听时间变化也没用,又不可能定时去获取,所以何时需要同步,去请求这个接口成了问题,我处理的方案是在Interceptor中过滤结果,当某个接口返回时间戳异常时,不把结果往上返,再执行一次时间戳接口,如果获取成功,传入参数并重构之前的请求,如果获取失败,把之前时间戳异常的接果返回。

由CSDN博主猝死引发的思考

  今天看到一个不幸的新闻,CSDN博主、年仅26岁的音视频专家雷霄骅或因过度劳累猝死,我感到非常伤心,本是风华正茂的年龄,就这样没了,他的家人该多么伤心,他的才华也化作一缕青烟,他留给我们的只是一篇篇用心血书写的博客。我特意翻看了他的博客,三百多篇原创干货,音视频专家,这些成就是大多数码农可望不可即的。

retrofit2.0源码解析(一)

题外话

第一次听说retrofit框架,还是同窗hanks推荐,SOHO的大字依旧发着光,hanks早已不在望京上班,hanks的github

Retrofit,一个类型安全的http客户端,适用于Android和Java

分析源码之前,首先在github上download源码,用IDEA打开编译。

<总结> 回顾、反省与计划

这个七月,全国多地都下暴雨,伴随灾情不断,我不忍看新闻报道,愿一切安好!

回顾

很久很久没在CSDN写博客了,或者说几乎没怎么写,这一停,就是一年半,这一年半里经历了深圳三月行,北京找工作,996工作制,封闭式开发,直到昨晚我打算提出离职,我才想起来回顾这一切。

这一年半里,我所在的两家公司都是小的创业公司,今年创业公司死了好多,能活下来的都是英雄,庆幸这两家公司都活的很好。作为技术人,我冒昧的来谈谈在小公司的好与坏:

项目重构总结-架构版

题外话:去年十二月份进行封闭式开发,我就打算对代码进行重构,重构的原因是代码层次不清晰,
Activity职责太多,Activity不仅要获取接口数据,还要对接口数据进行缓存,代码中充斥中各种数据状态判断以及层层回调,
更重要的是这样写不便于单独修改某一个接口实现,也不便于测试,更不便于mock数据,mock数据不依赖于接口返回,能自测很多状态切换逻辑,是多么重要。

我想要的效果:

  • 数据调用者(Activity或Fragment)不需要知道数据来自网络还是缓存,直接拿到解析好的Entity使用即可,但调用者能强制获取网络数据
  • 不同的接口可以使用不同的缓存方案,比如文件或者数据库
  • 不动调用者代码,能mock数据,每层之间便于测试
  • 层与层之间面向接口,低耦合

站在巨人的肩膀上

从反射分析HashMap存储原理

最近发现一篇讲解HashMap的帖子,我开始回顾了尘埃很久的java基础知识,涉及HashMap相关,我可能会说HashMap相当于IOS里的字典,存取键值的,接受null类型的键值,线程不安全的,HashMap是根据key的hashCode存取,底层是Hash表实现,再往下问,比如两个key的hashCode相等怎么办,hashCode如何对应到bucket位置的,bucketIndex一样怎么存取,好像说不下去了,说实在的自己从来没有真正去理解HashMap源码,顿时觉得自己好菜比,于是赶紧看源码,脑补一下自己的无知。

来一张图

一言以蔽之,HashMap底层是一个自动扩容数组,数组的每一项的一个单向链表。

avatar
Hiten
头像是我家小海豚,睡成一条虫了
FRIENDS
hanks