这两天发现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<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的妙用(转)的更多相关文章

  1. 安卓 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 版本,是 ...

  2. Android Studio在代码重构中的妙用

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  3. Android Studio 入门

    本文适用于从Eclipse转AndroidStudio的开发者 最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少 ...

  4. Android Studio使用百度地图示例BaiduMapsApiASDemo

    Android Studio使用百度地图示例BaiduMapsApiASDemo 用自己AVD下的debug.keystore替换掉项目中的debug.keystore 生成自己的签名 同样的方法生成 ...

  5. Android studio 多渠道打包

    一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧. 渠道信息一般在 AndroidManifest.xml中修改以下值: <meta-data android:name=&quo ...

  6. Android studio:从Eclipse迁移到Android Studio【一】

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255061&extra=page%3D2%26filter%3Dautho ...

  7. [Android Studio] Android studio 多渠道打包(超简洁版)

    [Android Studio] Android studio 多渠道打包(超简洁版) 转载:http://xuyazhou.com/archives/461 http://relex.me/usin ...

  8. 如何用Android Studio打多包名APK

    问题:项目中不同的分发渠道可能需要打包多种APK(同样的代码),包名可能是不一样的,如果一个一个修改包名重新编apk是很麻烦,可以参考下列步骤在Android Studio上操纵Gradle来打包不同 ...

  9. ANDROID STUDIO, GRADLE AND NDK INTEGRATION

    Originally posted on:http://ph0b.com/android-studio-gradle-and-ndk-integration/ With the recent chan ...

随机推荐

  1. QML 从入门到放弃

    发现了一个问题: QQuickView only supports loading of root objects that derive from QQuickItem. If your examp ...

  2. 【转】模块(configparser+shutil+logging)

    [转]模块(configparser+shutil+logging) 一.configparser模块 1.模块介绍 configparser用于处理特定格式的文件,其本质上是利用open来操作文件. ...

  3. JavaScript-DOM(重点)

    解析过程 DOM树(一切皆是节点) DOM可以做什么 清楚DOM的结构 获取其它DOM(事件源)的三种方式 事件 事件的三要素 绑定事件的方式 JavaScript入口函数 window.onload ...

  4. python3-深浅copy

    转载:https://www.cnblogs.com/ctztake/p/8194275.html 术语 变量:是一个系统表的元素,拥有指向对象的连接空间. 对象:被分配的一块内存,存储其所代表的值. ...

  5. Linux RTC驱动模型分析之rtc-sysfs.c【转】

    转自:https://blog.csdn.net/longwang155069/article/details/52353408 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  6. Aurelius vs mORMot vs EntityDAC Delphi 的 ORM框架

    Aurelius vs mORMot vs EntityDAC   Delphi 的 ORM框架: http://www.tmssoftware.com/site/aurelius.asp#produ ...

  7. 使用tomcat发布含有shtml文件的web程序

    平常都是使用html或jsp,当导入含有shtml的一个web项目时,向平常一样使用Jetty运行,访问到shtml文件时,直接在浏览器上显示出了源码. 查询,使用tomcat发布,修改tomcat的 ...

  8. php markdown 接口文档生成工具 SummerDoc

    2017年9月18日 19:20:22 星期一 因工作需要, 用PHP写了一个管理接口文档的小工具, 下边介绍一下: 浏览器展示的效果: 项目地址:(码云) 例子(http://doc.hearu.t ...

  9. T-SQL 数值函数

    MS SQL Server数字函数可以应用于数值数据,并返回数值数据. 下面是带有示例的数值函数列表. ABS() 输出给定值的绝对值. 例 以下查询将输出-22的绝对值:22. Select ABS ...

  10. (一)七种AOP实现方法

    在这里列表了我想到的在你的应用程序中加入AOP支持的所有方法.这里最主要的焦点是拦截,因为一旦有了拦截其它的事情都是细节. Approach 方法 Advantages 优点 Disadvantage ...