一行简单的
setContentView()
背后也会有大量的底层工作。往常总是手快的敲下这一行代码,甚至使用 AS 自动创建 Activity 都不用自己敲这一行代码,但是你有没有想过这一行简单代码背后的机制呢?这次就一起来看看。
阅读 Glide 源码的一些浅薄认识
Glide 里一句简单的
Glide.with(this).load(url).into(imageview)
背后其实有着非常复杂的逻辑和工作,这次正好碰巧有郭霖的博客在前方带路,我也顺便来看看 Glide 的源码实现。
在这篇文章里我不打算贴上大段的代码,我不会去仔细分析某段代码的作用,因为我自己或许都不太清楚,这篇文章我打算讲讲 Glide 实现的大体思路,通过这篇文章,你可以很快地知道 Glide 的大体架构,而不会深陷于代码的泥潭(主要还是源码实在太多太复杂了-_-||)。
记一次德企英文面试的经历
一开始听 HR 说要英文面试直接被吓到了,后来想想也没什么,学了十几年的英语终于有了用武之地。然后也跟 HR 做了简单的英文自我介绍。大概是觉得我的水平还凑活,后面有了电话技术面,好在这次是中文。然后电话面完又去了公司面。这家公司环境真的特别好,福利也非常不错,除了具体待遇因为还没谈,其实感觉希望也不太大吧。毕竟英文没那么 6,虽然当时自我感觉挺好,回来之后越想越觉得自己当时表现很差劲,之所以自我感觉良好还是公司的人都比较会照顾应聘者情绪吧。
因为没有好意思做笔记,下面的问题大部分都是事后回忆想起来的,还有很多想不起来的,不过基本没回答上的都包含在里面了。
让自定义 View 支持 ScrollView
看过《Android 开发艺术探索》一书的小伙伴都知道,这本书将自定义 View 分成四个类型,分别是:
- 继承 View 重写 onDraw 方法
- 继承 ViewGroup 派生特殊的 Layout
- 继承已有的 View
- 继承已有的 ViewGroup
借助工厂模式构建不同的 Fragment
还记的上篇文章 使用观察者模式解决单 Activity 与多个 Fragment 通信 中我使用了观察者模式暂时解决了 Activity 与多个 Fragment 之间的通信问题,最后的更新中我抽象了一个 Fragment 共同的基类:BaseFragment,在 BaseFragment 的构造方法中传入了 EventManager 也就是消息处理中心的实例,本来这样是没有问题的。直到今天,我升级了 AS 的 Gradle 的版本,然后重新编译项目的时候,报了一个错误:
使用观察者模式解决单 Activity 与多个 Fragment 通信
就目前而言,我所知道的 activity 与 fragment 之间通信方式还是很多的。比如:
- Handler 方式
- 接口方式
- 公有方法
- 广播方案
- EventBus
稍微分析下这五种方法,Handler 方式是了解了 Handler 的人最容易想到的,但是 Handler 不仅会增加各个模块之间的耦合性,而且只能单向通信,例如如果在 Activity 中实例化 Handler ,那么就只能由 Fragment 向 Activity 发送消息,而如果反过来 Activity 向 Fragment 发送消息则不易实现,既然不能双向,那么 Fragment 之间的通信也就无法实现了。
搞定 ScrollView 与内部 ListView 的同方向滑动冲突
最近在做毕设的时候,一个页面最外面套了一个 ScrollView,内部有多个 ListView,然后发现在相同方向的滑动总是会冲突,具体表现就是内部的 ListView 完全不能滑动,只有当一个手指按住非 ListView 区域,另外一个手指才能够滑动 ListView 的内容。这也是个典型的滑动冲突场景,是《Android 开发艺术探索》中提到的滑动冲突场景二。
牛客网春招模拟测试算法题(一)
题目一:好多鱼
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围minSize,maxSize,牛牛想知道有多少种大小的鱼可以放入这个鱼缸,
初探讯飞语音识别
利用百度地图在后台服务中定位
关于 LBS 带来的好处就不多说了,我们大家都从中享受了很大的便利,现在基于 LBS 的应用也层出不穷。我也是因为业务需求才接触到百度地图 SDK 的接入,尝试了下在前台 Activity 中获取定位按照 API 文档可以很轻松的实现,但是如果需要再后台进行定位就没那么简单了。尝试了很过次,参考了网络上的很多文章,最后终于找到了可行的方案。
我的 2016 年终总结
2016年即将结束,我也即将毕业。这一年相比去年我又有了成长,有了进步。更重要是的,我确定了今后的 发展方向。
方向
那么这一年我都做了什么呢。首先就是我刚才提到的,我确定了今后的发展方向。从今年三月学校开了 Android 的课程,到四月份我真正地自己开始感兴趣,我就确定了把 Android 开发作为自己今后的主要发展方向。在这个的基础上,逐渐横向和纵向拓展。虽然今年 Android 的工作已经开始不好找,截止到十二月为止,我还没有找到一份略为满意的工作。淡然我是不会就这么轻言放弃的。今年不行,还有来年,我一直在努力地提升自己,我相信不久之后,我肯定能找到适合自己的栖息地。我若盛开,清风自来。
忽略已提交文件并从历史记录删除
在 Android 的一个项目里需要加载 gradle 的配置文件,文件中有一些安全等级较高的信息,不想把这个文件同步到 git 里,但是等我发现的时候它已经在版本库里了,心塞。我知道如果是还没有被 git 管理的文件可以在 .gitignore
文件里添加忽略规则来忽略一些不必要的文件。但是如果已经添加到了版本库的文件又该如何删除并且忽略呢。
正确认识 Runnable
今天在写 Android 的时候,用到了 ProgressDialog 这个进度提示框,我把 progress 提前 new 出来,并在子线程开始之前把它 show 出来。这里我的子线程是 new 了一个 runnable 来实现的,在子线程做完耗时工作的最后,调用 progress 的 dismiss 方法。但是很奇怪,直到子线程结束,进度框都没有显示出来。
面向接口编程
其实我大二的时候开始,我就已经在不断地听说面向对象编程,这个词语不断地出现在我的眼前,并且在过去的几年里我也学习了 c# 这门同是面向对象的编程语言,可惜那个时候我还并没有将所有的心思放在对编程的研究中(惭愧)。这就导致我虽然身处在面向对象的世界中却不自知。知道升到本科,真正意识到自己要做一名软件开发人员,我才开始逐渐去了解面向对象编程这个思想。
解决 IDEA 中 创建 maven 项目时下载缓慢的问题
关于 IDEA 2016 maven web-app 速度缓慢的解决方式
这个问题的原因还是喜闻乐见的 GFW 的原因,maven 默认是从中央仓库更新依赖包和配置文件,所以下载非常缓慢。因此也导致项目无法正常生成,项目下的路径也不能正常创建。
好在中国还是有一些比较良心的公司,提供了maven的国内镜像,为我们这些屌丝开发者提供了可行的解决方案。
在 Ubuntu 上以源码方式部署禅道项目管理软件
背景
最近一门课程设计,需要使用一个比较丰富完善的系统来做项目管理,于是找到了禅道这个免费开源口碑也不错的管理软件,一开始我是用 linux 版本的一键安装包进行安装,确实比较傻瓜式。但是由于我的服务器端还另外开了 mysql 服务,禅道的一键安装包里另外包含了一个单独的 mysql 服务,一旦禅道启动,那么本地的 mysql 就会因为冲突儿无法启动,即使更改了禅道服务的端口号也还是不行。因此就想到了使用源码的方式来部署,这样就可以直接使用本地的 mysql 数据库了。虽然官网也有源码安装的教程,不过实在是太过简单了。此前从没有过接触过 php ,也就不会php环境的配置了。同时我也把 Tomcat 换成了 Apache。
基于 UDP 协议的 C/S 通信案例
因为在 Android 的通信这一块有点吃瘪,所以重新学习 Java 的网络编程。因为即时通讯中 UDP 的大放异彩,这里就来实现一个简单的 UDP 通信的案例。一开始不太熟悉,只能够实现客户端与服务端的单次通信,程序就会结束。也就是说客户端在向服务端发送一次数据,然后接收一次来自服务端的数据就会退出了。这对于我来说并没有什么意义。我想要达成的是服务端可以和客户端实现不间断的通信过程,其中可以是单向的连续发送或者连续接收。
桌面添加图标心碎二三事[摔]
虽然开发过程中经常会中奖踩坑,但是这次真的踩了很大的坑啊,感觉填了很久踩勉强填好。当然也只是对我来说,在大神眼里根本不算什么。事情是这样的,两天前我需要在 App 被安装的时候,向桌面添加一个快捷图标,来增强在用户眼里的存在感。。。由于在此之前我正好给 App 换了个图标,虽然是 png 格式,但是宽高病不同,分辨率大概是 620×610 的样子,基本是个正方形,而且用于 App 的桌面图标也没有什么问题,可以正常显示。但是在用于给 App 添加桌面快捷方式的时候,却死活也不显示,明明 log 显示确实已经添加了,代码执行良好,也没有报错和警告,但就是死活看不到。这是第一个坑。
迁移 Hexo 到腾讯云服务器 CVM
notifyDataSetChanged() 方法不更新数据的问题
一般我们习惯于使用 notifyDataSetChanged() 方法去更新 ListView 的数据,但是当有一天你发现调用这个方法没有更新数据的时候。。。我的心情是非常沮丧的。因为就在这段代码旁边的另外一个方法中也调用了 notifyDataSetChanged(),并且是有效的!这样我就更加郁闷了。