Startup News App源码简单分析
cfanr Lv4

前言

很久之前就了解到冯大辉弄的这个Startup News, 有点类似国外Hacker news的技术分享平台,也经常浏览。后来发现Startup News的Android客户端是开源的,而网络上也有很多这种技术资讯的分享平台(如推酷,极客头条等),所以想了解下这样的资讯平台的客户端是怎样实现的,所以就有了以下对Startup News的源码的简单分析和极客头条客户端的开发。

由于个人水平和时间有限,所以只是简单分析了SN的功能如何实现,学习其中实现方法和编程规范,至于SN用到actionbarsherlock,没使用过,而且现在有ToolBar代替,就没有详细了解了。

项目地址:StartupNews

1.编码规范:

代码的编码规范很重要,作者有写相关的编码规范文档,可以参考借鉴下:StartupNews编码规范

2.程序入口MyApplication和抽象的常量类Constants

MyApplication:
a.管理应用线程的线程工厂ThreadFactory和线程池ExecutorService
b.初始化谷歌分析EasyTracker
c.程序崩溃信息收集CrashHandler
d.SessionManager
e.初始化文章的已读记录和存储访问历史记录,用哈希表HashSet mHistorySet以文件的方式存储(访问查找时,比较高效。不用使用数据库)
此处用到多个单例模式,如bcd都有用到;

抽象的常量类Constants主要定义了一些存储到SD卡的信息,如程序崩溃的log,历史记录,登录后的cookie等;

3.包规范化:

com.halzhang.apps.startupnews.ui 应用的Activity和Fragment
com.halzhang.apps.startupnews.ui.phone 浏览文章时适配手机BrowseActivity
com.halzhang.apps.startupnews.ui.tablet 适配平板的Fragment
com.halzhang.apps.startupnews.ui.widgets 自定义控件
com.halzhang.apps.startupnews.utils 实用工具包,日期处理DateUtils, SharePreference数据的Preference,不同android版本处理的UIUtils, 崩溃日志记录CrashHandler等
com.halzhang.apps.startupnews.snkit 工具箱,解析Html的JsoupFactory,SessionManager和对应的api
com.halzhang.apps.startupnews.parser 解析器,对文章列表、评论进行解析
com.halzhang.apps.startupnews.entity 各个实体类的定义,实现序列化的接口
com.halzhang.apps.startupnews.analytics 谷歌分析的异常解析ExceptionParser

4.主要分析

Activity:
a.由于不用登录就可以直接查看app的内容,所以启动MyApplication后,就算用户没有登录,也不需先执行LoginActivity,而是直接执行MainActivity。

b.应用主要内容有三块:热门文章、最新文章和最新评论,是通过顶部标签导航效果来呈现的,代码是用JakeWharton的开源框架ViewPageIndicator实现。相关例子:Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

c.初始化布局setupViews(),作者做了适应不同屏幕的处理;
d.反馈部分,通过发email反馈的方式;
e.登录部分,LoginActivity,先通过SessionManager判断用户是否登录,显示登录或注销状态;此处用到的是Fragment(切换登录布局和正在登录进度条的布局,减少Activity的不必要跳转),两个异步任务:LoginPreTask利用Jsoup获取到登录的表单,将登录数据放进表单,在用UserLoginTask发送登录请求(并进行cookie管理,保存登录数据)

f.设置模块,AboutActivity,使用的是actionbarsherlock库的SherlockPreferenceActivity,此处将一些设置的常量存储在SharePreference中;

SNApiHelper处理用户投票(长按列表会有投票功能),使用WeakReference

Fragment:

a.热门文章和最新文章布局一样,同用NewsListFragment(继承抽象的AbsBaseListFragment),使用PullToRefreshListView框架来实现列表的下拉刷新和上拉加载更多,注意此处news列表的点击事件不是在NewslistFragment处理的,而是将事件在MainActivity调用处理;

b.当点击news列表时,跳转事件和存储访问记录addHistory()的事件是被封装在ActivityUtils的类里面;

c.跳转后,如果是平板,更新右栏,切换到BrowseFragment,如果是手机,跳转到BrowseActivity处理(布局是Fragment,处理方法将BrowseFragment添加到布局中)。另外,文章的加载使用的是自定义的WebView: ObservableWebView,添加上下滚动的监听接口,以判断隐藏还是显示底部的菜单bar;
此处将WebView和底部bar的点击事件封装成WebViewController

……

(有点乱-_-)

<完毕>