Android 开发总结

忙碌的一个月终于结束了,因为老板觉得我天天在公司就负责扫地,有点物过其用。就让我接手了一个同事离职的安卓代码。因为这个属于外包吧,有明确的时间要求,所以就只能天天加班来实现。 不过,在实现的过程中,确实找到了一些共性的东西。这边拿出来分享下。 选用的设计模式 MVP 首先就是安卓项目的代码划分。之前的说法,都是MVC式的划分方式,所以会出现一个问题。Activity 中代码杂糅。所以之后就出现了 MVP 的设计模式,也算是在 MVVM 成熟之前的一个过渡方案吧。 所以这样的代码设计起来是这样的: Ξ src/main git:(master) ▶ tree . ├── java │   └── com │   └── szjlxh │   └── ehs │ &nbs... [阅读全文]

Shell 中的一个坑(文件名带有空格时操作)

起因 今天本来想给 U 盘换歌,所以就直接把自己的网易云音乐下载的音乐拷进去,结果发现 U 盘的大小不够(最近比较穷,买不起3GB 以上的 U盘只能拿好多年前的3G U 盘先用着)。 差了400MB,想到车载电脑也放不了 flac 格式的音乐文件,所以就直接写脚本删除这些非 mp3 格式的歌曲文件。 初次尝试 于是按照之前的 allCode.sh 脚本,直接改了个 rmFileByExtension.sh 的脚本,其中,核心代码部分是这样的: function searchFiles() { echo "find all $filter files" if [[ x$filter == x ]]; then if [[ $sureRm == false ]]; then read -p "No exten... [阅读全文]

MBanner2 项目(二) --- 编写可测试的代码、实例展示

接上篇的项目基本设计,这次主要是来说具体的实现。 编写可测试的代码 不管在之前的 MBanner 1.0 分支的版本中,还是在借鉴的 QingtingBannerView 中,测试这个环节始终是遗漏的一点。毕竟都是程序员,很少会进行测试驱动开发。所以这次为了解决这个问题,我这边采用了 Junit 进行了部分的代码测试。也是一种测试驱动开发的尝试吧。 具体以具体的代码为例【MBannerLine.java】: 在 1.0 的版本中,MBannerLine 的绘制逻辑和视图的绘画是杂糅在一起的。 protected void onDraw(Canvas canvas) { if (mPosition == 0) { canvas.drawLine( (mPageSize - 3) *... [阅读全文]

MBanner2 项目(一) --- 基本设计

写这篇文章的一个出发点就是,对自己的 第一版本 非常的不满意,很多地方的解决思路不够优雅。换句话说就是基于 lib 的二次自定义非常麻烦。 所以才会开启 2.0 版本的开发(反正用的人也不会多,但是我比较喜欢抠细节)。 自定义程度不高主要体现在三方面: PagerViewAdapter 实现方式为 class,并不是接口,导致无法自定义 Adapter,从而绝了换 view 的路。 PageIndicator 实现方式单一,且无法改变。 代码的可测试性不强。(在安卓的组件中,这个问题还是挺棘手的) 总的来说,这只是个为了项目而催生的一个紧急替代品,并不能算得上是一个比较靠谱的开源库。所以 MBanner2 应运而生。 也算了了我一个心愿。 其实,这个空间也可以作为一个 ImageView 来使用。因为从逻辑和功能上说,这两... [阅读全文]

MBanner 介绍

最近做了一个安卓项目,因为有个部分是需要实现一个可以展示标题和图片的 AD Banner。所以就同性交友网上(github)上找了一些案例。 作为一个安卓初学者,所以一开始就选用了 star 最多的那个。效果也很好,但是对方提出了一个需求,就是希望在图片上显示标题。做一个类似的蜻蜓上面的 Banner 效果。所以,就搜索到了 QingTingBannerView 这个项目。 这个项目的 star 数非常高。所以一开始认为是挺靠谱的一个。但是使用中发现了如下几个问题。 在执行 BannerView.setEntities 的时候,他并不是直接的将数组替换,而仅仅是做一个 append 操作。也就是说,当刷新的时候,3个 Banner 会变成 6个 Banner,如果没有在外面做去重的话。 下部的 Title 和是在图片下方,会多占用20dp 左右的空间... [阅读全文]

如何实现 PHP 中的 Router

因为最近在写自己的 MFramework, 算是一个 PHP 的 web 框架吧。所以这个 Router 就是首先的一步。 首先看下 Kohana 框架的路由编写方式: Route::set('blogs', 'blogs/((/)(/))')->defaults( array ( 'controller' => 'blog', 'action' => 'list', 'limit' => 10 , 'page' => 0 ) ); 然后是 Zend 的路由设置, 建议阅读他的官方文档:Zend Router: $route = Method::factory(... [阅读全文]