oschina 客户端源码解析 【转】http://blog.csdn.net/wangchun8926/article/category/1315637
一、项目的目录结构
根目录
├ src
├ libs
├ res
├ AndroidManifest.xml
├ LICENSE.txt
├ proguard.cfg
└ project.properties
1、src目录
src目录用于存放项目的包及java源码文件。
下面是src目录的子目录:
src
├ com.weibo.net
├ greendroid.widget
├ net.oschina.app
├ net.oschina.app.adapter
├ net.oschina.app.api
├ net.oschina.app.bean
├ net.oschina.app.common
├ net.oschina.app.ui
└ net.oschina.app.widget
- com.weibo.net — 新浪微博SDK源码包
- greendroid.widget — 快捷菜单栏组件(国外UI库GreenDroid)
- net.oschina.app — APP启动及管理包
- net.oschina.app.adapter — APP列表适配器包
- net.oschina.app.api — API访问包
- net.oschina.app.bean — APP实体包
- net.oschina.app.common — APP工具包
- net.oschina.app.ui — APP界面包
- net.oschina.app.widget — APP控件包
2、libs目录
libs目录用于存放项目引用到的jar包文件。
下面是libs目录里的jar包文件:
libs
└ commons-httpclient-3.1.jar
- commons-httpclient-3.1.jar — Apache的HttpClient包
3、res目录
res目录用于存放项目的图片、布局、样式等资源文件。
下面是res目录的子目录:
res
├ anim
├ color
├ drawable
├ drawable-hdpi
├ drawable-ldpi
├ drawable-mdpi
├ layout
├ menu
├ raw
├ values
└ xml
- anim — 动画效果
- color — 颜色
- drawable/drawable-hdpi/drawable-ldpi/drawable-mdpi — 图标、图片
- layout — 界面布局
- menu — 菜单
- raw — 通知音
- values — 语言包和样式
- xml — 系统设置
AndroidManifest.xml用于设置应用程序的版本、主题、用户权限及注册Activity等。
一、app是怎样启动的
android项目中通过在manifest.xml文件中配置launcher activity来启动应用程序,首先我们查看oschina的manifest文件,如下图
如图所示可以看到充当launcher的是AppStart Activity,我们查看AppStart的源代码
可以看到通过一个动画渐变的方式来跳转到主页,其中setAnimationListener用来设置对动画事件的监听
动画的持续时间是2s,渐变度从0.3到1.0
然后为view绑定此动画
当动画效果结束后调用redirectTo方法跳转到首页
一、首页UI分析
先来看看首页的界面
根据此页面我们再来看看对应的布局文件
下面就来分析一下此布局文件
1.首先是一个main_header,我们打开此main_header文件来一睹其芳容
此文件代表的UI为:
2.接下来是一个自定义的ScrollLayout,该控件可以左右滑动切换页面,继承于ViewGroup
3.然后包含了4个layout,分别代表
a.frame_news(资讯)
b.frame_question(问答)
c.frame_tweet(动弹)
d.frame_active(我的空间)
也即分别对应底部菜单前4个被点击后所对应的页面
4.最后,是一个main_footer,对应底部菜单
好了,这就是首页整个的UI,接下来回详细讲解首页的一些逻辑功能
一、打开Main.java文件,找到其onCreate方法,我们知道onCreate方法是Activity生命周期方法之一,通常做一些程序的初始化工作。在Main.java的onCreate方法中,首先初始化了一个广播接收器
那么,何为广播接收器呢,请参照另一篇博客
我们可以看到,该广播使用动态注册方式来进行注册的,那么该广播是在什么时候发送的呢?
在TweetPub.java中有这么一段语句
然后继续跟进sendBroadCastTweet方法
哈哈,源码面前毫无秘密~完全是一个标准的发布广播程序,该处的action和Main.java中注册广播时的action完全相同,那在Main.java中的广播接收者有什么用呢?
别慌,下面就来看看该广播接收者的源码
'
如果what=1,表示已经发送 了动弹,这时发送通知广播,该广播接收者源码
主要用于在首页显示消息数目
发送完通知广播后是刷新一些动弹或状态的消息列表数据
接下来,如果what != 1,再重新发送一遍广播通知,最后显示是否重新发送动弹操作对话框
综上,这就是广播接收程序的主要逻辑
继续昨天的讲解,昨天讲到了在Main.java中实现了一个广播接收程序,之后,是一系列的初始化操作
一、网络连接的判断
这里的appContext是一个全局的应用程序类,是Application类的子类,关于Application,官方的解释是:
再来看isNetworkConnected方法
该方法首先获得ConnectivityManager,然后获得NetworkInfo来判断网络是否可用,很简单,只是简单的API调用,关于getSystemService的深入讲解,以后会讲到
二、页面数据的初始化
判断完网络及初始化登录信息后,接下里便进入了重点:页面数据的初始化
1.初始化头部视图
该段代码主要初始化了一些头部页面的数据,并设置了某些按钮的点击事件,包括搜索(资讯页面)、发帖(问答页面)、发布动弹(动弹页面)
2.初始化底部栏
特别注意fbSetting,点击该按钮会弹出一个自定义的对话框
实现这一效果的代码如下:
mGrid是一个在定义的UI,继承于PopupWindow(关于更多PopupWindow介绍),即弹出对话框
那么,mGrid是在哪里初始化的呢?
可以看到在此初始化了,并设置了相应的监听器
接下来是initPageScroll方法,该方法用于初始化整个app的水平滚动分页,要值得注意的是
这里为什么要*2?
请看footer的布局文件内容
button与button之间隔了一个imageview,所以这里要乘2
默认显示第一页(即第一个footer的icon为选中状态,不幸可在此处改为其他数值查看)
最后是初始化页面相关内容,并在不同tab页跳转时设置底部菜单的选中状态
紧接着时初始化各个主页的按钮
初始化通知信息标签控件
初始化所有的listview
好了,这就是今天要讲的初始化相关的内容!
OSChina Android源代码剖析(7)-异步加载数据
接着昨天的初始化listview方法,今天重点介绍initNewsListView方法
该部分代码主要是为首页的咨询页面准备数据以及初始化相关点击事件的操作,接下来进入重点介绍的加载数据的逻辑
我们可以看到该方法开启了一个线程,在该线程的run方法中,获取NewsList对象
该列表数据有可能从网络中获取,也有可能从缓存中获取
接着,回到异步加载数据的主方法,涉及到了handler、message相关的知识点,这里将将要加载的数据放在message中,然后handler将此message通过sendMessage方法放入一个消息队列中,接着通过handleMessage方法处理该消息,这样做的目的可以避免在主线程中加载数据最后导致ANR的发生;在Android开发中,始终牢记一点,那就是不要在主线程中做大量耗时的工作,给你的应用一个良好的用户体验,关于更多handler的讲解,请看这里
最后来看看此handler的handlemessage方法
这里主要逻辑是拿到加载数据后UI的相关出处理
综上,这就是异步加载数据的主要逻辑
一、关于android中双击事件的实现
打开NewsDetail.java文件,在onCreate方法中有一个regOnDoubleEvent方法
可以看到,在该方法中用到了GestureDetector类以及该类的一个接口SimpleOnGestureListener,该类表示的是一个手势,其中的onDoubleTap方法的意思是:
接下来的逻辑也就是执行全屏与非全屏的转换,并无太大难点
最后,注册该手势事件
关于dispatchTouchEvent,官方的文档解释是:
主要将touch事件分发到window中
二、关于 onDoubleTap与onDoubleTapEvent的区别?
请看以下demo
1.项目结构
2.主要代码MainActivity
3.执行结果(双击界面)
综上,onDoubleTap会执行一次结果,而onDoubleTapEvent会执行两次结果