Categories
Android

吐槽一下新浪微博 Android SDK V2.4.0

吐槽一下新浪微博 Android SDK V2.4.0

周末逛逛github,发现新浪更新了SDK,说是重大版本变更,瞄了一下,大概是文档更规范、代码重构之类的。老版本SDK代码全开放,但 2.3之后,封闭了部分代码。不管如何,我还是直奔观看 AsyncWeiboRunner.request 这个方法究竟改变了没有,结果还是失望了。

我建议微博 Android SDK 的开发人员,好好的阅读AQuery,Volley,android-async-http 这几个异步网络请求库,通过回调方式处理请求结果。新浪也是有回调结果,但要自己加 Handler 更新UI,官方的Demo在回调直接更新UI,其实就是在 http 请求线程里操作的,很容易给新手误导。

很多软件的开发都是如此,开始使用现成的,后面发现使用越来越不爽,不能满足自己的需求,决定重新搞。所以,Weibo for Android 计划使用 Volley作为http 处理库,自己写封装接口。我封装了一个GsonRequest,测试发现老是返回403,抓包才知道参数没有上传。使用 http get 传参数需要注意,重写getParams无效。见:

http://stackoverflow.com/questions/18484647/volley-does-not-call-getparams-for-my-custom-request

getParams() is not called on the GET method, so it seems you’ll have to add it to the URL before you send the request

Categories
Android

新浪微博Android客户端实战 – 使用ActionBarSherlock与MenuDrawer

很久没有为 Android for WordPress 项目贡献代码了,最近他们把代码放在 github 上,pull requests 方便了许多。之前我都是在trac上给他们提交patch, 新建一个ticket 贴上 svn diff 的结果,苦不堪言,最后只好放弃。在google play 上更新了客户端,界面比以前有很大的进步,可圈可点。因此,我决定参考wordpress, 使用上 ActionBarSherlock 与 MenuDrawer, 替换 android-action 组件。为什么一开始使用 android-action?因为 actionbar 的颜色我喜欢,而且组件使用简单。学习 ActionBarSherlock 是有些成本的,编译 sample 示例,边看效果边看代码。

主要修改点:

1. 将 android.app.Activity 替换为 SherlockActivity

// file: BaseActivity.java
import com.actionbarsherlock.app.SherlockActivity;

public class BaseActivity extends SherlockActivity {
// activity implementation
}

2. getMenuInflater 修改为 getSupportMenuInflater,注意,要把android 自带导入的Menu包删掉,导入ActionBarSherlock的包,不然会提示无法 Override onCreateOptionsMenu。

3. 把项目中 libs/android-support-v4.jar 干掉,这个会与abs的冲突。eclipse 报错:

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time).
All versions of the libraries must be the same at this time.
Jar mismatch! Fix your dependencies

4. abs 进度条尺寸很大,需要改小一点的,参考: Android: Changing the Default Indeterminate Progress Size in ActionBarSherlock

ActionBarSherlock 修改记录: https://github.com/lytsing/weibo/commit/3d6f203a390460b4cdd1c8f8543c523ad55f0ccb

使用 MenuDrawer

MenuDrawer 跟 abs 可以很好的结合使用,照着 android-menudrawer-abs-sample 写。修改记录:https://github.com/lytsing/weibo/commit/15e61dc2fbb556b68db21d2fe8a4d0e2aadc4938 图标,背景颜色,后期再需要调整。

Categories
Android

新浪微博Android客户端实战 – 查看详细微微博信息

Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily. 只有那些有耐心将小事做好的人才能掌握轻而易举完成难事的技巧。 ——Friedrich Schiller

上一节实现了Timeline, 点击某条记录,进入新的Activity,观看更详细的信息,实现的功能有:

  • 加载中等大小的图片
  • 显示地理位置信息
  • 加载评论
  • 转发、评论、收藏

预览图如下:

微博详细信息
微博详细信息

上面是微博信息,跟Timeline的差不多,layout布局稍作调整,其中图片显示为中等大小的图片,根据地理位置经纬度参数,插入Google地图。

中间位置是评论信息,放在ListView里,那么就遇到了滚动问题,本博客有篇小文 千万不要把Listview放在ScrollView里 描述了这种情况,那么这里也使用MergeAdapter,把不同的view合在一块。

最下边的位置,提供快速回复,方便输入。

那么转发、评论、收藏放在ActionBar即可,因为不是常用的功能。

完成了这些,到这里先打住,定时的回头自己给自己做 code review,删除没用的代码,要下狠心清理掉垃圾代码,对代码有洁癖感。顺便提一提实际开发过程中需要注意的,这些是初学开发者累犯的错误,有的甚至是有经验的工程师,平时对自己要求不严,就容易犯下这样的错误。

调试Log信息

插入调试信息,输入 aaaaaaaaa, bbbbbbbbbbbbbbbbb, —————— 1111111111111111111 222222222222222 这样没有规范的调试log。千万不要偷懒,再这样下去,别人看到你的代码,显得不够专业,是业余水平。而且不要烂使用 System.out.println 函数,统一使用 Android 提供的Log 方法,无论是哪个手机操作系统或者其他大型的系统,都有自己封装的Log函数,一致的使用只有好处没有坏处。这里问题又来了,有的使用一律使用Log.e 插入调试信息,问ta为什么?ta说醒目啊,一看都是红色的,令人哭笑不得。

语言国际化及文件编码

有的图省事在代码直接写入赤裸裸的中文,后期老板要求发个英文版的,才搞得很抓狂,狂修改,又引入新的bug,情绪很低落,真是恨铁不成钢啊。Windows 程序员习惯了gbk,压根儿没考虑到自己的代码会放在Linux/Mac 上,别的同事一看,擦,都是乱码!提醒下在eclipse把文件编码改为UTF-8,一个团队各有在Windows,Linux, Mac环境下工作很正常。

严谨,切记

讲个真实的故事,我们团队一工程师平时在代码注释里喜欢写shit, fuck之类的言语,程序员发泄嘛,可以理解。有次上线的版本,已经传到了国内各大电子市场,测试才发现打开应用有shit字样,老板暴跳如雷。赶紧fix掉,发布新版本,强制升级。这个字样在svn最新代码库里已经没有了,编译时没有及时更新代码到最新版本,导致悲剧发生。

代码参看: https://github.com/lytsing/weibo/blob/master/weibo/src/org/lytsing/android/weibo/ui/StatusDetailActivity.java

Categories
Android

新浪微博Android客户端实战 – Timeline

很久不更新了,博主快成太监了,适逢放假,继续写。

前段时间,陈华的唱吧火得一塌糊涂,也一直在用,最近才发现他们用了新浪微博客户端 sso 方式登录,原来新浪更新了SDK,代码托管从 code.google.com 移到 github。之前民间版本有Yusuke Yamamoto 写的 weibo4android,一些客户端版本也选择了在这基础上开发。都说,选择比努力更重要,我们还是选择官方的版本,因为他们专职做这些事情,能提供持续的更新的。

SDK 的使用,查看官网的pdf 文档,解释很清楚,依葫芦画瓢,我们拿到accessToken后,就好办事了。新版的API,全部使用interface,用C/C++的话来说,就是回调,相比上一个版本,使用AsyncTask显得很蹩脚。timeline 的实现,使用ListView控件,可以考虑使用下拉自动刷新组建Android-PullToRefresh android pull to refresh 基本满足要求,但需要滚动到底部也能显示“正在加载”,不怕做不到,就怕想不到,还真有人把这个给做好了, android-pulltorefresh-and-loadmore。这个组建运行在 ICS 滚动有问题,需要更新同步到 android-pulltorefresh 的 PullToRefreshListView.java。

ListView有图片需要加载,缓存,解决性能问题等,还是很麻烦的,可以使用 LazyListcwac-thumbnail等组建。为了尽快的看到结果,这里暂时使用 Andrid Query 的 image函数,使用方便。隆重介绍 Android Query,web工程师应该都知道jQuery,那么AQuery不言而喻了,写很少的代码,完成更多的功能。效果图:
weibo timeline

关于json 解析

一般有三种,Android内嵌的解析器,jackson,gson。从性能与文件大小考虑,这里使用gson。

关于分页

分页时传入page参数即可?非也!很容易理解,假设第一次取20条,第二次(page=2)再取20条,而这个过程,有插入的数据怎么办?这样是不准确的,应该是使用sinceId, maxId 这两个参数。请求大于sinceId是最新纪录,低于maxId 的是下一页(加载更多)。

内容格式化

包括:友好的时间展示,表情转义,话题(##之间),@,url等。一般使用正则表达式。

本篇代码: https://github.com/lytsing/weibo/blob/master/weibo/src/org/lytsing/android/weibo/ui/TimelineActivity.java

Categories
Android

新浪微博Android客户端实战(1-前言)

时下流行风,书籍前头喜欢冠上“人人都”,比如《人人都是产品经理》,《编程ING:人人都能学会程序设计》,我也想跟个风,这年头,不写个微博客户端,都不好意思说自己是做Android开发的。

目前网上已经有一大把教程如何写客户端,写的挺不错的,但有些内容已经过时,而且代码不是很完整。而code.google.com 有很多开放的代码,但又缺乏文档,有些代码写得不敢恭维,对代码有洁癖的我,实在无法看下去了。本博客很久不更新,一些网友怂恿我写一些关于Android开发的文章,想来想去,还是以某个应用的开发为题材吧。新浪官方的客户端为了兼容低版本,使用的api还是老的,现在Android 4.0 使用全新的 UI设计、交互体验,简洁流畅。我认为,一个好的 app 应该与操作系统保持设计的一致性。本系列文章基于 Ice Cream Sandwich,旧的 api不再使用。

以我的经验,写Android应用程序大部分时间花在UI,页面布局上,真正写代码的时间反而少。本客户端的目标不是做个大而全的东西,2-8定律无处不在,实现20%的功能,满足正常使用即可。基本功能:登录,Timeline,详细信息,发文,回复,转载。其他砍掉,事实上,一般人的使用习惯无非就是阅读信息,发文,评论,repost,用心研究这几个功能,做到极致,就很了不起了。

W.Jason Gilmore 在《PHP与MySQ程序设计》里写道:”优秀的程序员会编写可靠的代码,而卓越的程序员则会重用优秀程序员的代码。“。使用新浪微博提供的SDK,再加上一些优秀的Android UI 开源组件,我们可以很快速的开发一款客户端。

目标读者:本文不会step-by-step讲得很详细,前提假设你会搭建开发环境,会一些起码的编程基础,看过ApiDemos,正好挽起袖子干一些事。所有的代码都放在github上,可以下载编译安装运行,有个直观感觉,比什么都好。好了,让我们开始新的征程。