过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨的大家庭中,最受开发者喜爱的五个Android库。希望通过对它们的了解,能够对你的开发工作有所帮助。

**
**

1. GSON

Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可用于将Java对象转换成对应的JSON表示,也可以将JSON字符串转换成一个等效的Java对象。如果与API打交道的话,那么这将会是你经常需要的东西。我们主要使用JSON的原因就是,相较XML,轻量级的JSON要简单的多。

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;"><span class="comment" style="color: #008200;">// Serialize </span>  </span>

- <span style="color: #000000;">String userJSON = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Gson().toJson(user);  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;"><span class="comment" style="color: #008200;">// Deserialize</span>  </span>

- <span style="color: #000000;">User user = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Gson().fromJson(userJSON, User.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>);  </span>

2. RETROFIT

 

就如它网站上的介绍“Retrofit将你的REST API变为Java接口”一样,Retrofit把REST API返回的数据转化为Java对象方便操作,对于在项目中组织API调用,是一个不错的解决方案。其请求方法和相对URL都带有注解,使得代码变得更加简洁。使用注解,你可以很容易的添加一个请求主体,操纵URL或头文件,并添加查询参数。除此之外,每个函数可以定义为同步或异步,具有返回值的函数为同步执行,而异步函数没有返回值且最后一个参数为Callback对象。

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">interface</span> RetrofitInterface {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="comment" style="color: #008200;">// asynchronously with a callback</span>  </span>

- <span style="color: #000000;">    @GET(<span class="string" style="color: #0000ff;">&#8220;/api/user&#8221;</span>)  </span>

- <span style="color: #000000;">    User getUser(@Query(<span class="string" style="color: #0000ff;">&#8220;user_id&#8221;</span>) <span class="keyword" style="font-weight: bold; color: #006699;">int</span> userId, Callback<User> callback);  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="comment" style="color: #008200;">// synchronously</span>  </span>

- <span style="color: #000000;">    @POST(<span class="string" style="color: #0000ff;">&#8220;/api/user/register&#8221;</span>)  </span>

- <span style="color: #000000;">    User registerUser(@Body User user);  </span>

- <span style="color: #000000;">}  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;"><span class="comment" style="color: #008200;">// example</span>  </span>

- <span style="color: #000000;">RetrofitInterface retrofitInterface = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> RestAdapter.Builder()  </span>

- <span style="color: #000000;">            .setServer(API.API_URL).build().create(RetrofitInterface.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>);  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;"><span class="comment" style="color: #008200;">// fetch user with id 2048</span>  </span>

- <span style="color: #000000;">retrofitInterface.getUser(2048, <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Callback<User>() {  </span>

- <span style="color: #000000;">    @Override  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> success(User user, Response response) {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    @Override  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> failure(RetrofitError retrofitError) {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">});  </span>

Retrofit默认情况下使用的是GSON,所以无需自定义解析,同时还支持其他转换器。

 

3. EVENTBUS

EventBus是用于简化应用中各个部件之间通信的一个库。比如从一个Activity发送消息到一个正在运行的服务,亦或是片段之间简单的互动。而下面使用的示例,就是如果网络连接丢失,该如何通知一个活动:

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> NetworkStateReceiver <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> BroadcastReceiver {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="comment" style="color: #008200;">// post event if there is no Internet connection</span>  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onReceive(Context context, Intent intent) {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onReceive(context, intent);  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">if</span>(intent.getExtras()!=<span class="keyword" style="font-weight: bold; color: #006699;">null</span>) {  </span>

- <span style="color: #000000;">            NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);  </span>

- <span style="color: #000000;">            <span class="keyword" style="font-weight: bold; color: #006699;">if</span>(ni!=<span class="keyword" style="font-weight: bold; color: #006699;">null</span> && ni.getState()==NetworkInfo.State.CONNECTED) {  </span>

- <span style="color: #000000;">                <span class="comment" style="color: #008200;">// there is Internet connection</span>  </span>

- <span style="color: #000000;">            } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span>(intent  </span>

- <span style="color: #000000;">                .getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {  </span>

- <span style="color: #000000;">                <span class="comment" style="color: #008200;">// no Internet connection, send network state changed</span>  </span>

- <span style="color: #000000;">                EventBus.getDefault().post(<span class="keyword" style="font-weight: bold; color: #006699;">new</span> NetworkStateChanged(<span class="keyword" style="font-weight: bold; color: #006699;">false</span>));  </span>

- <span style="color: #000000;">            }  </span>

- <span style="color: #000000;">}  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;"><span class="comment" style="color: #008200;">// event</span>  </span>

- <span style="color: #000000;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> NetworkStateChanged {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">private</span> mIsInternetConnected;  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> NetworkStateChanged(<span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> isInternetConnected) {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">this</span>.mIsInternetConnected = isInternetConnected;  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">boolean</span> isInternetConnected() {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">return</span> <span class="keyword" style="font-weight: bold; color: #006699;">this</span>.mIsInternetConnected;  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">}  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> HomeActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity {  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    @Override  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState);  </span>

- <span style="color: #000000;">        setContentView(R.layout.activity_main);  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">        EventBus.getDefault().register(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); <span class="comment" style="color: #008200;">// register EventBus</span>  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    @Override  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onDestroy() {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onDestroy();  </span>

- <span style="color: #000000;">        EventBus.getDefault().unregister(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); <span class="comment" style="color: #008200;">// unregister EventBus</span>  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">    <span class="comment" style="color: #008200;">// method that will be called when someone posts an event NetworkStateChanged</span>  </span>

- <span style="color: #000000;">    <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onEventMainThread(NetworkStateChanged event) {  </span>

- <span style="color: #000000;">        <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (!event.isInternetConnected()) {  </span>

- <span style="color: #000000;">            Toast.makeText(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, <span class="string" style="color: #0000ff;">&#8220;No Internet connection!&#8221;</span>, Toast.LENGTH_SHORT).show();  </span>

- <span style="color: #000000;">        }  </span>

- <span style="color: #000000;">    }  </span>

- <span style="color: #000000;">  </span>

- <span style="color: #000000;">}  </span>

4. ACTIVEANDROID

 

ActiveAndroid算是一个轻量级的ORM(对象关系映射),让你无需编写一个单独的SQL语句,就可以保存和检索SQLite数据库记录。每个数据库记录都被包裹整齐地归为一类,如delete()和save()的方法。

扩展ActiveAndroid Model的对象能够保存在数据库里,如:

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">user.save();  </span>

可以轻易替代大型SQL语句:

 

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">INSERT INTO Users (Nickname, Name, Address, City, PostalCode, Country) VALUES (<span class="string" style="color: #0000ff;">&#8216;Batman&#8217;</span>,<span class="string" style="color: #0000ff;">&#8216;Bruce W&#8217;</span>,<span class="string" style="color: #0000ff;">&#8216;Palisades 21&#8217;</span>,<span class="string" style="color: #0000ff;">&#8216;Gotham&#8217;</span>,<span class="string" style="color: #0000ff;">&#8216;40000&#8217;</span>,<span class="string" style="color: #0000ff;">&#8216;USA&#8217;</span>);  </span>

获取所有用户的例子:

 

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">List<User> users = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Select().from(User.<span class="keyword" style="font-weight: bold; color: #006699;">class</span>).execute();  </span>

而其对应的SQL语句是这样:

 

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">SELECT Nickname, Name, Address, City, PostalCode, Country FROM Users;  </span>

ActiveAndroid是移除大量,用于和数据库一同工作的样板代码的一个很好的方法。当然除此之外,还有其他开源解决方案,如GreenDAOORMLite

 

5. UNIVERSAL IMAGE LOADER

UIL是是一个开源项目,其目的就是提供一个可重复使用的仪器为异步图像加载、缓存和显示。它的使用很简单:

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">imageLoader.displayImage(imageUri, imageView);  </span>

尽管Picasso拥有更好的API,但其缺乏自定义。而使用UIL构建器几乎可以配置所有(其中最重要的就是在抓取和缓存大型图片时,Picasso会失败)。

 

良好的开源库会让你的开发变得更简单更快速,而普遍流行的库通常测试良好且易用使用。在大多情况下,你可以很容易的将它们从Maven中导入到Android Studio项目里。将它们添加到相关性的build.gradle 文件。并且同步之后,在你的应用里将能够很好的实现它们。

 

**[js]** [view plain](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[copy](http://www.csdn.net/article/2014-06-16/2820224-top-5-android-libraries#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/394286)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/394286/fork)
  <div>
  </div>
</div>
- <span style="color: #000000;">dependencies {  </span>

- <span style="color: #000000;">    compile <span class="string" style="color: #0000ff;">&#8216;com.google.code.gson:gson:2.2.4&#8217;</span>  </span>

- <span style="color: #000000;">    compile <span class="string" style="color: #0000ff;">&#8216;com.squareup.okhttp:okhttp:1.3.0&#8217;</span>  </span>

- <span style="color: #000000;">    compile <span class="string" style="color: #0000ff;">&#8216;com.squareup.retrofit:retrofit:1.3.0&#8217;</span>  </span>

- <span style="color: #000000;">    compile <span class="string" style="color: #0000ff;">&#8216;de.greenrobot:eventbus:2.2.+&#8217;</span>  </span>

- <span style="color: #000000;">    compile <span class="string" style="color: #0000ff;">&#8216;com.nostra13.universalimageloader:universal-image-loader:1.9.1&#8217;</span>  </span>

- <span style="color: #000000;">}  </span>

💬 评论