Android Studio Flavors的妙用(转)
这两天发现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

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

然后看我们app的build.gradle加了以下内容
android {
...
productFlavors {
prod {
}
mock {
}
}
}
到这一步,也没看出什么不一样的。注意看,下面变化开始了
选中app-src 右键New->Directory新建文件夹mock

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

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

细心的你会发现mock下的java文件夹是蓝色的,prod文件夹则不是,why?
那是因为当前默认编译是在mock 这个Flavor
点击左下角的Build Variants打开窗口,可以看到app module 当前的Build Variant是mockDebug
你可以试试把mockDebug改为prodDebug再回到Project窗口,这一次是prod下的java为蓝色的了。

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

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

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

然后切换到mock版同一位置也建一个一样名字的ModelManager。
这里注意一点,在mock和prod建的文件必须是一样的,而且要是main里不能有的。
因为mock版的所有文件是main+mock里的,prod版的所有文件是main+prod里的
最后画风是这样的:

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

下面看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<LoginPresenter> onCreateLoader(int id, Bundle args) {
return new PresenterLoader(this, new PresenterFactory<LoginPresenter>() {
@Override
public LoginPresenter create() {
return new LoginPresenter(ModelManager.provideUserModel());
}
});
}
搞定这一步后就是HAPPY的时候了:
切换到prod版LoginPresenter传入的参数IUserModel就是真实环境的UserModel
切换到mock版LoginPresenter传入的参数IUserModel就是模拟环境的FakeUserModel
服务器没好我切mock自已搞,服务器好了我切prod跟你调,哈哈,妈妈再也不用担心我调接口了!
作者:仙鬼
链接:https://www.jianshu.com/p/3ce164863d44
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Android Studio Flavors的妙用(转)的更多相关文章
- 安卓 android studio 报错 All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com
这个问题是Android studio升级到3.0之后,运行的时候会提示gradle要升级到3.5版本才能编译.于是我把我的gradle升级到了 gradle-4.1-milestone-1 版本,是 ...
- Android Studio在代码重构中的妙用
代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...
- Android Studio 入门
本文适用于从Eclipse转AndroidStudio的开发者 最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少 ...
- Android Studio使用百度地图示例BaiduMapsApiASDemo
Android Studio使用百度地图示例BaiduMapsApiASDemo 用自己AVD下的debug.keystore替换掉项目中的debug.keystore 生成自己的签名 同样的方法生成 ...
- Android studio 多渠道打包
一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧. 渠道信息一般在 AndroidManifest.xml中修改以下值: <meta-data android:name=&quo ...
- Android studio:从Eclipse迁移到Android Studio【一】
转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255061&extra=page%3D2%26filter%3Dautho ...
- [Android Studio] Android studio 多渠道打包(超简洁版)
[Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...
- 如何用Android Studio打多包名APK
问题:项目中不同的分发渠道可能需要打包多种APK(同样的代码),包名可能是不一样的,如果一个一个修改包名重新编apk是很麻烦,可以参考下列步骤在Android Studio上操纵Gradle来打包不同 ...
- ANDROID STUDIO, GRADLE AND NDK INTEGRATION
Originally posted on:http://ph0b.com/android-studio-gradle-and-ndk-integration/ With the recent chan ...
随机推荐
- 20165325《Java程序设计》第九周学习总结
一.教材学习笔记 ch13 1.URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用URL创建对象的应用程序称作客户端程序. 一个URL对象通常包含最基本 ...
- 【VMware vSphere】ESXi系统开启SSH协议
写在前面: SSH为建立在应用层基础上的安全协议,是目前较为可靠,专为远程登录会话和其他网络服务提供安全性的协议.感兴趣的话,可以百度了解 在这里,我们需要将S ...
- office 产品密钥
刚买的小新,配置下office,作为技术人员,喜欢Share以下 office 产品密钥,任你选一组 一.序列号激活法(密钥激活法)这种是最为安全而且最为正规的方法,通过取得合法的序列号(密钥)进行激 ...
- Redux 和 React-Redux简介
先说一下,为什么会产生Redux这样的框架,我们在开发React应用时,会发现组件之间需要进行数据的交换和传递.体现在: 1. 父组件要向子组件传递数据 通过修改子组件的props 2. 兄弟组件之间 ...
- Git学习笔记04-管理修改
Git跟踪并管理的是修改,而非文件.新增文件,修改一行,删除一点,都算是修改. 在.git工作区新增一个文件,test.txt,输入test git ...然后git add add之后修改t ...
- python3+requests库框架设计03-请求重新封装
在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下. 具体怎么封装还是要看被测 ...
- Linux下编写和加载 .ko 文件(驱动模块文件)
一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...
- ansible笔记(10):初识ansible playbook
ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...
- 使用js下载文件
使用Echarts地图时,需要一些地图数据,到Echarts下载地图数据文件时,发现其下载是直接通过js下载,从其网站上扒下来的记录于此 FileSave.min.js网络地址:http://ecom ...
- java结合testng,利用excel做数据源的数据驱动实例
数据驱动部分,是自动化测试常用部分,也是参数化设计的重要环节,前面分享了,mysql.yaml做数据源,那么再来分享下excel做数据驱动 思路: 先用POI读取excel.解析读取数据,返回list ...