这两天发现Android Studio 的Flavors用起来相当给力!这里跟大家分享下:

Flavors中文翻译过来叫“口味”,不知道确切叫法是啥,它的功能就是允许你的APP有多个不同的版本,不同版本的代码可以不一样,如多渠道打包(咦!这样看到中文渠道很贴切呀,哈哈),可以有baidu,360等等!

我今天讲这个不是多渠道打包,这块交给专业打包的GG,我们这里讲适合做项目开发的用法。

我们把项目分两个flavors:

mock:模拟版,这里所有数据都用写好的模拟数据来运行APP

当你要开发一个新功能,但是服务器代码还没有写好的时候怎么办?

傻等么,Of cause not!我们切换到mock版用模拟数据继续往下搞。

prod:真实版,这里所有数据都用真实数据来运行APP

当服务器开发好了,要联调了我们再切换到prod版来调。

光说没用,无图无真相:

这里使用我上一篇文章的项目:Android MVP高级

选中项目,右键->Open Module Settings 打开Preject Structure

Paste_Image.png

选中Flavors 点击“+” Name 填mock 再点“+”添加一个prod点OK

Paste_Image.png

然后看我们app的build.gradle加了以下内容

android {

...

productFlavors {

prod {

}

mock {

}

}

}

到这一步,也没看出什么不一样的。注意看,下面变化开始了

选中app-src 右键New->Directory新建文件夹mock

Paste_Image.png

接着选中刚刚建的mock文件夹,右键New->Directory新建文件夹java

同理新建prod.java文件夹,最后结果如下:

Paste_Image.png

细心的你会发现mock下的java文件夹是蓝色的,prod文件夹则不是,why?

那是因为当前默认编译是在mock 这个Flavor

点击左下角的Build Variants打开窗口,可以看到app module 当前的Build Variant是mockDebug

你可以试试把mockDebug改为prodDebug再回到Project窗口,这一次是prod下的java为蓝色的了。

Paste_Image.png

回来,选中mock下的java,右键 New->package新建一个和main中一模一样的包,这里是cn.huangx.mvpsample3

Paste_Image.png

同理,把Build Variant切换到prodDebug同样新建一个一样的包,最后结果如下:

Paste_Image.png

选中所建包名右键New->Java Class新建一个ModelManager

Paste_Image.png

然后切换到mock版同一位置也建一个一样名字的ModelManager。

这里注意一点,在mock和prod建的文件必须是一样的,而且要是main里不能有的。

因为mock版的所有文件是main+mock里的,prod版的所有文件是main+prod里的

最后画风是这样的:

Paste_Image.png

切换到mock版(要习惯,这一篇经常要切来切去)新建model包,并在包下新建一个FakeUserModel类,这个就是我们的模拟数据类了

Paste_Image.png

下面看FakeUserModel类内容:

public class FakeUserModel implements IUserModel {

Handler handler = new Handler();

/**

* 登录

*

* @param username 用户名

* @param password 密码

* @param callback 回调

*/

@Override

public void login(final String username, final String password, final Callback callback) {

handler.postDelayed(new Runnable() {//延时200ms回调,模拟网络请求

@Override

public void run() {

if ("huangx".equals(username) && "123456".equals(password)) {

callback.onSuccess();

} else {

callback.onFailure("用户名或密码错误(mock)");

}

}

}, 2000);

}

}

FakeUserModel实现了IUserModel接口,与main中的UserModel一模一样,为了区分onFailure信息后面加上(mock)。

要明白这一点,FakeUserModel是假的,main中的UserModel才是调用真实数据,这个Demo里为了演示,main没有用真实实现,记住就好!

然后是mock中ModelManager内容:

public class ModelManager {

public static IUserModel provideUserModel() {

return new FakeUserModel();

}

}

提供一个静态方法provideUserModel产生一个FakeUserModel。

切换到prod版,这里的ModelManager是这样的:

public class ModelManager {

public static IUserModel provideUserModel() {

return new UserModel();

}

}

这里的provideUserModel方法产生的就是真实的IUserModel实现

重头戏来了,我们回到main的LoginActivity的onCreateLoader方法,把new UserModel()替换成ModelManager.provideUserModel()

public Loader onCreateLoader(int id, Bundle args) {

return new PresenterLoader(this, new PresenterFactory() {

@Override

public LoginPresenter create() {

return new LoginPresenter(ModelManager.provideUserModel());

}

});

}

搞定这一步后就是HAPPY的时候了:

切换到prod版LoginPresenter传入的参数IUserModel就是真实环境的UserModel

切换到mock版LoginPresenter传入的参数IUserModel就是模拟环境的FakeUserModel

服务器没好我切mock自已搞,服务器好了我切prod跟你调,哈哈,妈妈再也不用担心我调接口了!

android studio int转,Android Studio Flavors的妙用(转)相关推荐

  1. android百度api配置,Android Studio 配置使用百度api (附带简单样例)(示例代码)

    还是和同学开发的那个课程作业项目的app, 要使用到百度地图的api 但是,官方文档貌似只有Eclipse的例子,对Android Studio似乎没有说明.  难道,是因为后者是 "Doo ...

  2. visual studio 2017 创建 android 本地共享库(.so) 并从 C# android 项目中调用

    Developing Xamarin Android Native Applications ★★★★★ ★★★★ ★★★ ★★ ★ February 23, 2015 by Ankit Asthan ...

  3. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  4. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  5. 【Android NDK 开发】Android.mk 配置动态库 ( Android Studio 配置动态库 | 动态库加载版本限制 | 本章仅做参考推荐使用 CMake 配置动态库 )

    文章目录 I . Android Studio 中使用 Android.mk 配置动态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  6. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

    本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...

  7. android studio刷rom,Android Studio 之 ROM【1】, Entity,Dao,Database

    Android Studio 之 ROM, Entity,DAO,DataBase 1.Entity 实体类 package com.example.roombasic; import android ...

  8. android登录操作代码,Android Studio实现第三方QQ登录操作代码

    来看看效果图吧 实现QQ登录了, 新建一个项目工程 ,然后把我们刚才下载的SDK解压将jar文件夹中的jar包拷贝到我们的项目libs中 导入一个下面架包就可以 项目结构如下 打开我们的清单文件And ...

  9. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

最新文章

  1. 被美国主流投资平台看好,虎牙缘何能在上市大军中脱颖而出?
  2. JVM-Java内存区域
  3. Ubuntu全盘备份与恢复
  4. Linux工作笔记032---Centos7.3/8.2 下安装mysql_不局限于MySql版本
  5. GO、Rust这些新一代高并发编程语言为何都极其讨厌共享内存?
  6. win10虚拟机连接不上内网服务器,win10虚拟机网络设置_win10虚拟机怎么连接网络...
  7. 「查漏补缺」2020 截止9月2日 秋招前端面试经历 (已整理答案)
  8. Android 集成谷歌地图
  9. 计算机专业在哪个城市就业好,计算机专业在哪几个城市就业好点?
  10. 云计算趋势:从SAS和RAID看服务器与存储的融合
  11. 经济基础知识(初级)【5】
  12. 2021玉林芳草中学高考成绩查询,「分数线」2020年成都玉林中学招生录取分数线...
  13. CVPR 2018视频行为识别挑战赛概览
  14. 中餐厅第四季站点线路
  15. linux shell 获取当月第一天与最后一天,扣丁学堂Linux培训简述在shell脚本中获取上个月最后一天的日期方法...
  16. 软件工程专业就业前景怎么样?
  17. 多无人机辅助移动边缘计算中的任务卸载和轨迹优化
  18. 凯撒加密的最简单的理解与实现(Java版)
  19. Ubuntu常用命令大全(珍藏版)
  20. R语言——拍拍贷利率数据分析

热门文章

  1. Error: Assignments can only be reset if the group ‘group‘ is inactive, but the current state is Stab
  2. 惹事之后,亚马逊AI助手Alexa将增新功能,真的能比自己更懂你?
  3. python爬虫 爬取淘宝搜索页面商品信息数据
  4. 哪里有什么类似几何画板的软件?
  5. Linux 命令学习_无名小仙男
  6. p2p 企业信贷 UML 跨行清算
  7. 大前端时代的挑战与机遇(深圳场)正式开放报名
  8. CCF2018年:小明放学C++答案
  9. websocket重连机制
  10. verilog自学笔记