Android下使用googleapi-client-java操作google calendar(二)

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;

扩展了一个时间属性。

你可能感兴趣的:(java,jvm,android,xml,Google)