ThinkSlow

Results 20 issues of ThinkSlow

1.1.6打包,安装错误; 升级到1.1.7,打包,安装正常,但获取不到渠道

不知看这篇文章的你,是否一只孤独的单身汪~ 如果是的话,让我告诉你恋爱的那件小事~ 从本文,你可能会感悟到恋爱真经和学习到观察者模式。 ## 爱情故事 ### 心动的感觉 忙忙人海中,靠着左右手生活了二十来年的你,在刚从洗手间出来的刹那间,遇到那个想要过一生的人,怦然的心动.... 从此变得不可收拾,你总是情不自禁,偷偷的观察她的一举一动,总是想知道她干嘛。也好想引起她的注意,可以你好怂。因为,喜欢一个人,就是小心翼翼的.... 你终于忍不住了,不想错过对人了,鼓起了勇气,小碎步的走到她旁边,结结巴巴的,"Hi,我是...是....技术部的XXX,可以...可以加你微信么?" 然后,你的通讯录里有了她的名字。可是,你变了,总是傻傻的盯着她名字,打开了聊天框又关了,一直这样重复重复着... 今天,直男癌晚期的你,喝了口江小白,紧张的给她发了人生第一句招呼:“Hello,my world!” “在,有什么事么?” “没事,有点无聊” “哦哦哦” “上个月碰到你,被你深深的吸引了,能不能和你进一步的发展,做个朋友呢” “可以呀,多个朋友多条路” “谢谢” 此时,你开心到起飞,你的心已经在天空飘来飘去~ 小姐姐默默把你加入到帅哥列表中... ![](https://user-gold-cdn.xitu.io/2019/7/9/16bd6cb5efb4051e?w=545&h=217&f=png&s=9114) 在你喜欢小姐姐那一刻起,你就变成了观察者,小姐姐就变成了被观察者。因为关心小姐姐的生活,所以被成功加入姐姐的帅哥列表中,表示你和小姐姐产生了订阅关系。 ![](https://user-gold-cdn.xitu.io/2019/7/9/16bd6d84f29f3428?w=1440&h=900&f=jpeg&s=195611) ### 幸福的感觉 就这样,每天在微信偶尔聊聊天,打打招呼。但妹纸只有在自己有困难的时候才会主动找你,例如帮忙修电脑。 今天,妹纸的电脑又坏了,妹纸问了帅锅列表的所有人,“Hi,我电脑坏了,有空帮我修一下么?”每个帅锅都收到了,但他们顾着撩其他妹纸,没空。 只有你有空,于是你兴高采烈的帮忙修电脑,妹纸给你端来的温水,给你擦擦,好幸福哦。。。 ![](https://user-gold-cdn.xitu.io/2019/7/9/16bd6ccb45a1d135?w=512&h=217&f=png&s=12610)...

本文记录在Android Studio踩的坑.... #### 1、Decompiled .class file,bytecode version:51.0(Java 7) [网上解决方法](https://blog.csdn.net/u010917495/article/details/51234179) 但解决不了我的,最后我让Android Studio扫描整个SDK文件,就搞定了。 #### 2、Gradle sync issue connection timeout Mac 更新到Android Studio 3.4.2版本,Gradle 5.1.1怎么同步都同步不了,而在Windows一下就好。 [网上解决方法](https://blog.csdn.net/u013020000/article/details/73159754) Google几天,都没有用,最后的最后,卸载干净,重新安装就好.......... #### 3、Android Studio(Windows环境) Terminal控制台git log 中文乱码...

## 前言 如果大学时好好读书,对本文的知识点应该会很熟悉,大部分知识和图片来源于《计算机网络》这本书。最近老是想到这本书,就从网上找了资源来学习,并和大家分享。该书的PDF在GitHub,感兴趣可以下载和Star(条件允许还是买书吧),或者利用零散时间学习,就看我的文章吧。 **Star**支持吧 ## 传输层 本文主要讲的是传输中的两大重要协议TCP和UDP,虽然在Android开发中,并不需要了解到这么底层,但有理论的支撑,写代码总是很自信的啦。理论指导着实践,实践是理论检验的唯一标准。站在巨人的肩膀窥伺网络世界。 ![](https://user-gold-cdn.xitu.io/2019/7/14/16bee70e67cf7243?w=558&h=482&f=png&s=113696) ## UDP 用户数据报协议UDP只在IP的数据报服务至上增加了复用和分用的功能以及差错检测的功能。只有面向无连接的报文,不可靠传输的特点。UDP对应用层交下来的数据只添加首部,并进行特别的处理,就交给网络层;对网络层传递上来的用户数据报拆封首部后,原封不动的交给应用层。 ![](https://user-gold-cdn.xitu.io/2019/7/14/16bee3dc3f833f8e?w=442&h=169&f=png&s=37913) ### UDP的首部格式 用户数据报UDP分为两个字段:数据字段和首部字段,从图来分析用户数据报UDP的首部格式。 ![](https://user-gold-cdn.xitu.io/2019/7/14/16bee3ea3304bc7e?w=479&h=249&f=png&s=52530) UDP首部字段很简单,由4个字段组成,每个字段的长度都是两个字节,共8字节。 * **源端口** 原端口号,在需要对方回信时选用,不需要时可全0 * **目的端口** 目的端口号,这在终点交付报文时必须使用,不然数据交给谁呢? * **长度** UDP的长度,最小值为8字节,仅有首部 * **检验和** 检测用户数据报在传输过程是否有错,有错就丢弃。 在传输的过程中,如果接收方UDP发现收到的报文中的目的端口不存在,会直接丢弃,然后由网际控制报文协议ICMP给发送方发送“端口不可达”差错报文。...

在TCP/IP协议族中,两大重要协议就是传输层的[TCP协议](https://juejin.im/post/5d2757356fb9a07ef7109ecc)和网络层的IP协议。本文主要讲网络层的IP协议以及其他相关协议。 ## IP协议 IP协议作为TCP/IP协议中最重要协议之一,理解和掌握IP协议相关知识点,在实际项目工作中,能起到指导性作用。 ### 分类IP地址 分类地址即将32位IP地址划分成两个固定长度的块,每个块代表不同的含义。其中一个称为网络地址,用来标明主机所接入的网络,该网络地址在全球唯一的;另一个称为主机号,标识接入前面网络地址的主机。从这种两级的IP地址结构可以看出,IP地址在互联网上都是唯一的。常见的分类地址就是A类、B类、C类。 ![](https://user-gold-cdn.xitu.io/2019/7/28/16c36666acafbcd1?w=788&h=464&f=png&s=130702) 上图中,A类、B类、C类都是单播地址,网络号前面0、10、110值固定的,永久不会改变。其对应的网络号位数也分别是8、16、24位。网络号所占位数越多,能接入的主机就越少,毕竟IP地址固定为32位。 32位二进制的记法并不适合我们人类阅读,从引进方便人类阅读的点分十进制,也就是我们熟悉的样子:128.11.3.31。 ![](https://user-gold-cdn.xitu.io/2019/7/28/16c366c0a8a08373?w=1032&h=258&f=png&s=74508) 在A类地址中,网络号占8位,第一位固定为0,那么还剩下7位。由于网络号全为0代表本地(“this”)和网络号全为1(0111 1111)代表本地软件的环回地址。所以可分配的网络号数为27-2。与网络号类似,主机号全零的IP地址表示“本机”所连接到的单个网络地址;而全1则表示该网络号上的所有主机。因此A类的主机数为224-2。 在B类地址中,网络号占16位,即两个字节,前两位固定,那么可分配的网络号数为214(因为网络号后面14位无论如何取值,都不会出现全零和全1的状况,所以不需要减2。但实际上128.0.0.0网络地址是不指派的,所以网络地址总数应该是214-1。那么主机号数共216-2。 C类地址与B类地址类似,所以网络地址总数为224-1,主机数为28-2。 D类地址常用于多播,即一对多通信。 ### IP数据报格式 通过IP数据报的格式可以知道IP数据报具有什么功能。 ![](https://user-gold-cdn.xitu.io/2019/7/28/16c390cccb6168ad?w=1110&h=604&f=png&s=276236) IP数据报由首部和数据两部分组成,首部固定20个字节,也就是说IP数据报最小长度20个字节。 * 版本:长度共4位,指定IP协议的版本,例如IPv4(版本号为4)和IPv6(版本号为6),通信双方使用的IP协议版本必须一致。 * 首部长度:长度共4位,因为首部存在可变部分,所以首部长度=固定部分(20字节)+可变部分长度。因为固定部分长度20个字节,所有首部长度最小值为5(因为首部长度字段 所表示数的单位是32位字长,即4个字节。20个字节等于数5,即0101)。当首部长度4位为最大值全为1时,即十进制的15,那么可以表示首都最大长度为60字节。当首部长度不是4个字节的整数倍时,需要用填充字段进行填充。 * 区分服务:用来获得更好的服务,一般情况下不使用。 * 总长度:长度为16位,单位为字节,表示整个数据报的长度,即总长度=首部长度+数据部分长度。总长度最大值为216-1=65535个字节。...

## 前言 以前对下面的问题,我的态度是,不报错就是没问题,报错就用快捷键,根据Android Studio提示修复问题,从来不去问个为什么?现在代码洁癖症越来越严重的我,忍不住想看清什么东西在搞鬼。 认真看完本文,一定可以学到最新的知识。就算看不下去,也要点个赞收藏,绝对不亏。本文并不是吐槽Lint的不好,而是在学习Lint过程碰到问题,心态是奔溃的,以及解决每个问题带来的喜感。 不知道大家有没有注意项目中黄色代码块的提示,如下图所示: ![](https://user-gold-cdn.xitu.io/2019/7/18/16c054df73e921b9?w=1750&h=754&f=jpeg&s=172409) 或者红色标记的代码(并没有任何错误),如下图所示: ![](https://user-gold-cdn.xitu.io/2019/7/18/16c054e281bbdb36?w=2016&h=162&f=jpeg&s=108125) 上文黄色的提醒和红色警告,都是来自Android Studio内置的Lint工具检查我们的代码后而作出的动作。 通过配置Lint,也可以消除上面的提醒。例如,我开发系统APK,根本不需要考虑用户是否授权。 那么Lint是什么呢? ## Lint > Android Studio 提供一个名为Lint的静态代码扫描工具,可以发现并纠正代码结构中的质量问题,而无需实际执行该应用,也不必编写测试用例。 > Lint 工具可检查您的 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。 也就是说,通过Lint工具,我们可以写出更高质量的代码和代码潜在的问题,妈妈再也不用担心我的同事用中文命名了。也可以通过定制Lint相关配置,提高开发效率。 ### Lint禁止检查 由于Android Studio内置了Lint工具,好像不需要我们干嘛。可是呀,我有强迫症,看着上面的黄色块,超级不爽的。所以我们得了解如何配置Lint,让它为我们服务,而不是为Google服务。 本文开始的红色错误可以通过注解来消除(一般建议是根据提示进行修正,除非明白自己在做什么),可以在类或该代码所在的方法添加`@SuppressLint`。...

RxJava一路走来,已经是第三个版本了~现在百分之99.99还在使用RxJava 2.X ## 主要变化 ### 主要特点 * 单一依赖:Reactive-Streams * 继续支持Java 6+和Android 2.3+ * 修复了API错误和RxJava 2的许多限制 * 旨在替代RxJava 2,具有相对较少的二进制不兼容更改 * 提供Java 8 lambda友好的API * 关于并发源(线程,池,事件循环,光纤,演员等)的不同意见 * 异步或同步执行 * 参数化并发的虚拟时间和调度程序 * 为测试schedulers,consumers和plugin...

## 一、前言 想写篇关于Binder的文章,可对其一无所知,无从下手。在阅读了大量的优秀文章后,心惊胆战的提笔,不怕文章被贻笑大方,怕的是误人子弟!望各位大佬抽空阅读本文的同时,能够对文章的知识点持怀疑态度,共同探讨,共同进步! ![](https://user-gold-cdn.xitu.io/2019/6/30/16ba8dcd5ee7d187?w=500&h=427&f=jpeg&s=91849) ## 一、序列化 日常开发中,通过Intent携带数据跳转Activity时,数据通常要通过实现Serializable或Parcelable接口,才能在被Intent所携带,而Serializable接口和Parcelabel接口主要是完成对象的序列化过程。将对象持久化到设备上或者网络传输同样也需要序列化。 ### 1.Serializable 接口 Serializable接口是Java所提供的,为对象提供标准的序列化和反序列化操作。通常一个对象实现Serializable接口,该对象就具有被序列化和反序列化的能力,而且几乎所有工作有系统自动完成。Serializable接口内serialVersionID可指定也可以不指定,其作用是用来判断序列化前和反序列化的类版本是否发生变化。该变量如果值不一致,表示类中某些属性或者方法发生了更改,反序列化则出问题。(静态成员变量和transient关键字标记的成员不参与序列化过程) ### 2.Parcelable 接口 Parcelable 接口是Android所提供的,其实现相对来说比价复杂。实现该接口的类的对象就可以在Intent和Binder进行传递。 ### 3.两者的区别 Serializable是Java提供的接口,使用简单,但序列化与反序列化需要大量的IO操作,所以开销比较大。Parcelable是Android提供的序列化方法,使用麻烦当效率高。在Android开发中,将对象序列化到设备或者序列化后通过网络传输建议使用Serializable接口,其他情况建议是用Parcelable接口,尤其在内存的序列化上。例如Intent和Binder传输数据。 ## 二、AIDL 在Java层,想利用Binder进行夸进程的通信,那就得通过AIDL(Android 接口定义语言)了,AIDL是客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口,只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL,如果是在单应用(单进程),建议使用Messager。 ### 1、AIDL支持的数据类型...

## 前言 最近一直在思考一个问题,如何写文章?即内容高质量又通俗易懂,让新手既明白其中蕴含的真理又能轻松跑起第一个程序,同时也能让高手温故知新,如获新欢。经过长时间的思索,最终定位为,内容高质量,描述简洁,思路清晰,对读者负责任的文章。初出茅庐,不会高手的底层功力,也不会段子手的套路人心,但,坚持做自己,尽自己所能,为人民服务。 ## BLE的一些关键概念 在Android应用层开发BLE,不懂一些理论和协议也没关系,照样可以上手开发。本着知其然知其所以然,下面知识点的理解,能够有力支撑使用Android API。 ### 蓝牙类别 低功耗蓝牙是不能兼容经典蓝牙的,需要兼容,只能选择双模蓝牙。 * **低功耗蓝牙**:字如其名,第一特点就是**低功耗**,一个纽扣电池可以支持其运行数月至数年,至于怎么实现低功耗,看下文。**小体积,低成本**,在某宝上的价格有提供邮票体积大小,价格三四块前的蓝牙模块,可以想象,厂商批发价格会更低。**应用场景广**,可以想想,现在的智能家居,智能音箱,智能手表等等物联网设备,大多数通过BLE进行配网和数据交互。 * **经典蓝牙**:经典蓝牙,泛指蓝牙4.0以下的都是经典蓝牙,蓝牙4.0以上的,你还怀念通过蓝牙让音箱播放手机的音乐么?经典蓝牙常用在语音、音乐等较高数据量传输的应用场景上。 * **双模蓝牙**:即在蓝牙模块中兼容BLE和BT. 在**Android 4.3及更高版本**,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能,在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的要求。也就是说在Android 4.3以上,我们可以通过Android 原生API和蓝牙设备交互。 ### GAP(Generic...

## 前言 原来蓝牙现在还分经典蓝牙、低功耗蓝牙和双模蓝牙,技术的发展真的超过个人的认知速度,不学习意味退步。本来写着低功耗蓝牙和智能蓝牙音箱的交互,但写到最后,因为蓝牙音箱还没有做好,没办法给本文的结果做个保障,故最后改成蓝牙聊天。蓝牙聊天可能适合在搭飞机和高铁这种没有网络或者网络不好等特殊情况下使用。本文的Demo可以正常使用。 本文总体流程:发现蓝牙->配对蓝牙->连接蓝牙->数据交互 在这个流程,主要是一些细节和异常的处理,如何更好的体现用户体验。 ## 声明权限 在项目的配置文件AndroidManifest.xml加入如下代码即可,让APP具有蓝牙访问权限和发现周边蓝牙权限。 ``` //使用蓝牙需要该权限 //使用扫描和设置需要权限 //Android 6.0以上声明一下两个权限之一即可。声明位置权限,不然扫描或者发现蓝牙功能用不了哦 ``` Android 6.0以上动态申请权限位置权限,否则默认是禁止的,无法获取到蓝牙列表。 /** * Android 6.0 动态申请授权定位信息权限,否则扫描蓝牙列表为空 */ private void requestPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)...