2014年3月2日星期日

[]快速构建Android REST客户端#2 - iMID

本文自动转发自我的博客: http://www.haofengjing.org/?p=1605

快速构建Android REST客户端#2

数据解析和存储

JsonPaser

如果你还在使用Android提供的JsonObject来解析JSON数据,是时候鸟枪换炮了! Android开发中常用的JsonPaser有这么几个:

  • Gson 由Google开发的Json Parser 使用简单,只需要引入一个jar包,相对于Android系统提供的parser,效率有明显的优势
  • Jackson 另一个颇有名气的项目,需要引入很多包相对比较复杂
  • FastJson 阿里主导的开源项目,要求类的每一个属性都具备getter/setter这一点我不能忍

Gson的使用方法异常简单,例如我们要解析以下数据:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21
String json ="{          "id": 1,          "name": "Dan Cederholm",          "username": "simplebits",          "url": "http://dribbble.com/simplebits",          "avatar_url": "http://dribbble.com/system/users/1/avatars/original/dancederholm-peek.jpg",          "location": "Salem, MA",          "twitter_screen_name": "simplebits",          "drafted_by_player_id": null,          "shots_count": 147,          "draftees_count": 103,          "followers_count": 2027,          "following_count": 354,          "comments_count": 2001,          "comments_received_count": 1509,          "likes_count": 7289,          "likes_received_count": 2624,          "rebounds_count": 15,          "rebounds_received_count": 279,          "created_at": "2009/07/07 21:51:22 -0400"      }"  

需要创建Player类,在该类中声明所有需要解析的属性:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20
public class Player {      private long id;      private String name;      private String url;      private String avatar_url;      private String location;      private String twitter_screen_name;      private String drafted_by_player_id;      private int shots_count;      private int draftees_count;      private int followers_count;      private int following_count;      private int comments_count;      private int comments_received_count;      private int likes_count;      private int likes_received_count;      private int rebounds_count;      private int rebounds_received_count;      private String created_at;  }  

使用Gson:

1  2  3  4  5
Gson gson = new Gson();  // Json to object  gson.fromJson(json, Player.class);  // Object to json  String json2 = gson.toJson(Player.class);  

本着"不会偷懒的程序员不是好程序员"这一遵旨,在Driibo的设计中,数据库中仅存储了Json数据,免去了分列的繁琐。缺点是读取数据时需要用Gson重新解析,对效率有一定影响。

ContentProvider

ContentProvider着实让人很头痛,实际上Android文档中提到,如果没有跨进程的需求,或者向其他应用分享数据的需求就不必使用ContentProvider。但ContentProvider为数据库的管理提供了更清晰的接口,并且为了使用CursorLoaderContentProvider是必须构建的。

更多细节还请参阅 Api Guides – Content Providers

CursorAdapter & CursorLoader

使用CursorLoader是目前在Activity&Fragment中异步读取ContentProvider的最佳方案。CursorLoader还有一个更为强劲的功能,就是在接到数据变更的通知时会重新query一次,这样就保证了Cursor的数据始终与数据库同步。

基于以上两个特性,在列表中使用CursorAdapter填充数据可以有效的简化数据加载和更新的逻辑。


没有评论:

发表评论