3.与服务器进行数据交互:
交互是通过HTTP请求及响应来进行;数据被通过xml被打包成Atom协议(http://www.ietf.org/rfc/rfc4287.txt)格式交互。
按照Atom协议格式:
Google的日历数据是以feed为根节点打包返回,每个feed又可以包含多个entry,每个entry是一个日历。
同样日历中的事件也是以feed为根节点打包返回,每个feed包含多个entry,每个entry就是日历中的一个事件。
库函数对交互过程进行了封装。包括:将函数请求转换成HTTP请求以及将返回的XML数据解析到对象。
为了能够将XML数据解析到对象,需要定义一个数据模型,这里面包含日历feed,日历entry,事件feed,事件entry等对象定义。
而这个对象是由用户定义的,那么库函数怎么知道将XML数据解析后保存到哪个数据成员呢?
跟踪了代码简单总结其机制大概为:
XML中的数据每个成员都有名字,比如<entry><link>等,按照这个名字通过Java的反射机制来查找对象中的成员名字,如果名字相符,那么就保存到此成员变量。
而成员的名字如何传递给JVM呢?则是通过了Java annotation机制来实现的,在函数库中定义了一个annotation,名字为@key,
@Key("content")
public String var;
表示将变量var命名为content,库函数中可以获取到此附加信息,那么就会将XML中contentn成员的值解析出来保存到var中。
至于解析时如何将字符串转换成所需要的值,库函数会判断var的类型,来调用合适的生成函数。
3.1Feed基类:
根据ATOM约定,必然包含:
<id>、<title>、<updated>
一般还会包含多个<link>,所以Feed基类的成员定义如下:
@Key("id")
public String id;
@Key("title")
public String title;
@Key("updated")
public String updated;
@Key("link")
public List<Link> links;
如果不关注id、title、update等信息,可以不定义这些成员。
Link也是自定义的一个类,用来存储<link>节点的信息,其成员定义如下:
@Key("@href")
public String href;
@Key("@rel")
public String rel;
在Feed中还会包含<entry>,对于Calendar feed每个entry就是一个日历,对于Event feed每个entry就是一个事件。
由于两类entry的成员不一样,所以此处并没有包含entry成员,而是在扩展的Feed类中定义。
3.2Entry基类:
必然包含:<id>、<title>、<updated>
可能包含最多一个<content>;
可能包含最多一个<summary>
一般还会包含多个<link>;
所以Entry基类的成员定义如下:
@Key
public String summary;
@Key
public String content;
@Key
public String id;
@Key
public String title;
@Key
public String updated;
@Key("link")
public List<Link> links;
3.3CalendarFeed类:
@Key("entry")
public List<CalendarEntry> calendars = new ArrayList<CalendarEntry>();
扩展出一个保存entry的列表,列表中的每项是一个entry。
3.4EventFeed类:
@Key("entry")
public List<EventEntry> events = new ArrayList<EventEntry>();
3.5CalendarEntry类:
只扩展了一些操作接口。
3.6EvnentEntry类:
@Key("gd:when")
public When when;
扩展了一个时间属性。