dolphin browser development notes
【dolphin browser development notes】情景:
1:Client向Server发送请求,Server返回相应数据;
(1) 整个设计思路如下图所示:

(2)代码结构设计如下图所示:

代码结构大体可以分为4个层次,业务层,Model层,webservice层和Util层;
1>WebService层:向server端发出请求,然后返回server提供的数据(比如Json对象);
2>Model层:将Json对象进行处理,转化为数据对象,然后提供对象里数据的访问;
3>业务层:提供业务接口,比如是否缓存数据到本地,比如构建根据Server端返回的数据是否有更新,决定new 默认的数据对象还是有更新的数据对象。
4>Util层:提供一些公用的方法
2:如何分析相对复杂的界面实现
Android SDK tools下的hierarchyviewer脚本可以帮助我们查看某Activity的界面组织结构。
以DownloadManager为例:

从hierarchyviewer工具可以看出,该Activity为:BrowserDownloadPageActivity
(1)BrowserDownloadPageActivity的界面组织结构如下:

自定义的TabHost类包含两个FrameLayout,其中一个FrameLayout包含一个TabWidget,该TabWidget包含3个TextView,分别对应“正在下载”,“已下载”,“文件管理”;另外一个FrameLayout包含3个PhoneWindow$DecorView,每个PhoneWindow$DecorView对应一个新Activity的界面;
(2) DownloadingActivity界面组织结构如下:

FrameLayout包含一个FrameLayout和一个RelativeLayout,FrameLayout包含一个自定义的CustomMenuListView类,该CustomMenuListView包含若干个自定义的DownloadingItem类,每个DownloadingItem包含两个ImageView和一个RelativeLayout,该RelativeLayout包含3个TextView和一个自定义的HorizontalPrigressBar
(3) DownloadedActivity界面组织结构如下:

(3) FileManagerActivity界面组织结构如下

3:Android中callback通信的作用:
(1)情景一:工作线程执行耗时操作,主线程(UI线程)执行界面更新
Anwser:使用Handler,在工作线程中调用sendMessage(),在主线程(UI线程)中重写handleMessage;
a:自定义一个Handler extends Handler,重写handleMessage();b:自定义Runnable implements Runnable ,有一个成员对象Handler,在构造器中初始化,重写run(),在run()中调用该Handler对象的sendMessage()方法;
(2 情景二 :Activity启动自定义Dialog,然后在Dialog点击按钮后与该Activity通信:
Anwser:a:单独定义一个OnDialogDoneListener接口。b:该Activity实现OnDialogDoneListener接口。c:该自定义Dialog的有一个成员对象Activity,onClick事件中用getOwnerActivity()初始化,然后调用该Activity对象中实现OnDialogDoneListener接口中的方法;
4:SpeedDial关于本地预置数据和Server返回数据;
1):无论是本地预置数据还是Server返回数据都会存入most_visited表中;
2):本地预置数据:在创建数据库的时候,在OnCreate()里将/res/values/bookmarks.xml的speed_dials数组内容插入m ost_visited表中;Server返回数据:在程序第一次启动的时候,在FirstLaucherActivity的OnCreate里面向Server发出UURL请求,这个请求需要在AsyncTask里面完成,返回一个JSON数组,如果检测到JSON数组内容不为空,那么先将most_visited表中的所有记录删除掉,然后将JSON数组内容插入most_visited表;
3):MainActivity(主线程)直接从most_visited表中读取数据,显示出来;
4):如果调试的时候,删除most_visited表中的所有记录之后,在AsyncTask里面(非主线程)设置断点,一条一条的去插入server返回的数据;这个时候会发现:MainActivity(主线程)是实时监测most_visited表中的内容的,一旦most_visited表记录有增加,则界面上就会多一个有数据的speedDialItem;
5):单步调试向Server发出请求,Server返回Json数据;
之前lewa01这个渠道包就是只能显示本地的预置数据,不能显示Server返回的Json数据,经过单步调试,发现response.getFirstHeader("Last-Modified")为null,还继续getValue()导致NPE,直接执行catch()里面的代码而跳过了updateSpeedDials(),因此没有将Server返回的Json数据插入most_visited表;
5:Settings部分:
1)每一个setting页面都对应着一个/res/xml/xxx_preference.xml文件,该xml文件里面最外节点是ExpandablePreferenceScreen,里面节点可以是CheckBoxPreference,ListPreference,PreferenceScreen,自定义的FlashPlayerPreference,PreferenceDivider,自定义的ResetDefaultPreference,自定义的ChooseDownloadPathPreference。。。
2) 当defaultValue有值的时候,会在 /data/data/包名/包名_preference.xml里生成该配置项;
3) 在BrowserActivity onCreate()的时候,会BrowserSettings.getInstance(),这时候,也会loadFromDb(),读取设置项的值存到变量中,对于还没有生成设置项的,那么读取的值是默认的值,对于defaultValue有值的,读取的是 包名_preference.xml文件里面的值。
4) 点击PreferenceScreen跳转到另一个setting页面,对应关系是:PreferenceScreen里
本文来源 我爱IT技术网 http://www.52ij.com/jishu/398.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
