问题:

你想要在app当中增加新的library模块

解决方案:

使用library插件,增加一个library模块作为依赖。

讨论:

不可以通过使用java库给app增加许多功能,通常是使用jar包。1.5节讲述了如何使用dependencies块。举例子,为了使用Googles的Gson库解析json,可以在module的配置文件里面增加依赖:

dependencies {
compile 'com.google.code.gson:gson:2.6.2'
}

Android libraries超出了java library,因为它们不但包含android的API,还包括了需要的资源。当项目构建的时候,Gradle将Android libraries打包成aar(Android Archieve)文件,和jar文件类似,但是包含了Android的依赖。

从Gradle来看,Android libraries是root的一个子项目。这意味着它们就和Android应用一样,只是在一个子目录下面。module的名字因此被添加到settings.gradle文件里面:

include ':app', ':icndb'

在这样的情况下,Android library模块叫做icndb,代表着 Internet Chuck Norris Database,用来以json格式提供笑话。API页面如下:

作为一个Android library的示例,这个网站作为RESTful服务,返回的json数据会被解析,然后返回的笑话会被添加到WelcomeActivity的TextView。

在Android Studio里面可以通过“New Module”,选择“Android Library”新建一个library模块:

创建library名字后,你可以增加任何你想要的类型的activity。完成向导,创建了library目录,将它增加到根目录下面的settings.gradle文件里面。

每个library都有自己的Gradle配置文件。你可以指定最小和目标的SDK版本,自定义build types,flavors和按照需要修改依赖。最终要的区别是Gradle 配置使用了一个不同的插件:

apply plugin: 'com.android.library'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'LICENSE.txt'
}
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
}
}
}
dependencies {
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'

}

配置文件增加Retrofit2项目作为依赖想,使用Gsonlibrary转化JSON信息。

注意packagingOtions块的使用。这允许你排除在多个项目里面使用的同名文件。

如果你使用这些libraries,ICNDB库的使用就会变得很简单:

public class JokeFinder {
private TextView jokeView;
private Retrofit retrofit;
private AsyncTask<String, Void, String> task;
public interface ICNDB {
@GET("/jokes/random")
Call<IcndbJoke> getJoke(@Query("firstName") String firstName,
@Query("lastName") String lastName,
@Query("limitTo") String limitTo);
}
public JokeFinder() {
retrofit = new Retrofit.Builder()
.baseUrl("http://api.icndb.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
} public void getJoke(TextView textView, String first, String last) {
this.textView = textView;
new JokeTask().execute(first, last);
} private class JokeTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
ICNDB icndb = retrofit.create(ICNDB.class);
Call<IcndbJoke> icndbJoke = icndb.getJoke(
params[0], params[1], "[nerdy]");
String joke = "";
try {
joke = icndbJoke.execute().body().getJoke();
} catch (IOException e) {
e.printStackTrace();
}
return joke;
}
@Override
protected void onPostExecute(String result) {
jokeView.setText(result);
}
}
}

JokeFinder类使用提供的首字母和结尾字母访问ICNDB网络服务,使用异步任务,这样就可以使得操作在非UI线程运行。getJoke方法包含了一个TextView参数,这样JokeTask完成的使用进行更新。

IncdbJoke任务只是一个简单的POJO匹配JSON响应。响应的格式如下:

JSON很小,所以对于的IcndbJoke类也很简单,如下:

public class IcndbJoke {
private String type;
private Joke value;
public String getJoke() { return value.getJoke();} public String getType() { return type; }
public void setType(String type) { this.type = type; } public Joke getValue() { return value; }
public void setValue(Joke value) { this.value = value;} private static class Joke {
private int ID;
private String joke;
private String[] categories; public int getId() { return ID; }
public void setId(int ID) { this.id = ID; } public String getJoke() { return joke; }
public void setJoke(String joke) { this.joke = joke; } public String[] getCategories() { return categories; }
public void setCategories(String[] categories) {
this.categories = categories;
}
}
}

应用通过JokeFinder类使用library。在module的配置文件里面使用project依赖,如下:

使用project方法编译应用,将包含子目录的module作为参数。结果就是Gradle知道在构建app之前先构建ICNDB模块,这样使得在编译时可以使用类。

WelcomActivity在JokeFinder里面调用getJoke方法,提供一个TextView的引用和第一个和最后一个名字。如下:

运行结果如下:

构建进程在icndb/build/outputs/arr目录下生成了debug和release版本:

aar文件可以发布到仓库,供以后的app使用。

总结下:

1、Android library项目是需要Android依赖(Android APU的类或者资源)的java项目

2、Gradle为多项目使用子目录,每个子项目添加到根目录下的settings.gradle文件里面

3、在Android Studio里,使用“New Module”向导里面的“Android Library”创建Android Library项目

4、library项目使用com.android.library插件

5、app配置文件使用 project(":library")依赖来使用library。

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.5——使用Android Libraries的更多相关文章

  1. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.2——使用Android Testing Support Library进行测试

    问题: 你想要测试app的Android组件. 解决方案: 使用新的测试类实现JUnit风格的测试. 讨论: 测试像activities,services等的Android组件,需要将app部署到连接 ...

  2. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.7——使用Android Studio签署发布apk

    问题: 想要使用Android studio生成签名配置,给他们分配build类型. 解决方案: Build菜单提供了生成签名配置,Project Structure窗口有tab用于分配不同的type ...

  3. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  4. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  5. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务

    问题: 你想用自己的任务定制gradle的构建过程. 解决方案: 在gradle的build文件里面增加task元素.用Android插件支持的extra属性使得开发更容易. 讨论: Gradle的D ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.1——使用Build Types

    问题: 你想要自定义debug和release的build types,并且新建一些新的types. 解决方案: 使用buildTypes块配置build types. 讨论: build type决 ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.6——签署发布apk

    问题: 为了将APK发布到google市场,需要对APK数字签名. 解决方案: 可以使用java的keytoll命令去创建一个证书,并且在gradle配置文件的signingConfigs块使用. 讨 ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.4——更新新版本的Gradle

    问题: 你需要更新应用的Gradle版本. 解决方案: 生成一个新的wrapper,或者直接修改属性文件(.properties). 讨论: Android Studio包含了一个Gradle的分发. ...

随机推荐

  1. .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

    过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...

  2. django学习笔记【002】创建第一个django app

    2.3.3 1.创建一个名叫polls的app python3. manage.py startapp polls tree mysite/ mysite/ ├── db.sqlite3 ├── ma ...

  3. mysql init_connect

    init_connect 服务器为每个连接的客户端执行的字符串.字符串由一个或多个SQL语句组成.要想指定多个语句,用分号间隔开.例如,每个客户端开始时默认启用autocommit模式.没有全局服务器 ...

  4. WCF基础教程——vs2013创建wcf应用程序

    引言   近期在项目中见到了师哥们常常谈到的WCF这方面的知识.当时在写程序的时候也没有理解wcf究竟是个什么东西? 以及我们为什么在项目中会採用这种框架来实现,仅仅是依照师哥他们写好的代码编写同样格 ...

  5. 又开一坑,运动图形MoGraph for Unity

    Fragment+random: Vertex+random, Vertex+plain Vertex+Sound Plexus like 写了个大概,暂时没这方面需求先放这边了. C4D原版片段和克 ...

  6. Atitti.数据操作crud js sdk dataServiceV3设计说明

    Atitti.数据操作crud js sdk dataServiceV3设计说明 1. 增加数据1 1.1. 参数哦说明1 2. 查询数据1 2.1. 参数说明2 3. 更新数据2 3.1. 参数说明 ...

  7. PMON

    PMON是一个兼有BIOS和boot loader部分功能的开放源码软件,多用于嵌入式系统. 与BIOS相比功能不足,与常见的bootloader 相比,功能要丰富的多.基于龙芯的系统采用 pmon ...

  8. Binary Tree Postorder Traversal --leetcode

    原题链接:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题目大意:后序遍历二叉树 解题思路:后序遍历二叉树的步骤: ...

  9. [个人开发人员赚钱九]做一个日收入10元的APP!

    [导语]尽管讲了非常多个人开发人员的文章.但新手开发人员怎样赚自己的第一个10块钱.确是最难的事情.群里有人说都不知道干什么app赚钱.全然没有想法.而且常常问我有什么高速赚钱的方法.我仅仅能遗憾地 ...

  10. Java的ThreadContext类加载器的实现

    疑惑 以前在看源码的时候,总是会遇到框架里的代码使用Thread.currentThread.getContextClassLoader()获取当前线程的Context类加载器,通过这个Context ...