当前位置: 首页 > news >正文

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

 
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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 
 

转载于:https://www.cnblogs.com/kenshinobiy/p/9190833.html

相关文章:

  • linux下怎么卸载自带的JDK和安装想要的JDK
  • 1、win10下的Docker+Redis 的下载及简单使用
  • 单例设计模式
  • PHP多进程系列笔记(三)
  • Netty基础
  • 探讨.NET Core的未来
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • Mantis 1.3.13报表显示问题
  • SQL Server 与 DSN
  • 关于怎么在手机端实现一个拖拽的操作
  • 每日笔记之2018-06-26之小总结
  • emoji web端处理
  • libvirt-qemu-虚拟机设备热插拔
  • 【刷算法】从上往下打印二叉树
  • 温故之.NET 中的并行并发概念解析
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • @angular/forms 源码解析之双向绑定
  • HomeBrew常规使用教程
  • JavaScript 基础知识 - 入门篇(一)
  • Javascript基础之Array数组API
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java中具有继承关系的类及其对象初始化顺序
  • Objective-C 中关联引用的概念
  • supervisor 永不挂掉的进程 安装以及使用
  • win10下安装mysql5.7
  • 规范化安全开发 KOA 手脚架
  • 日剧·日综资源集合(建议收藏)
  • 少走弯路,给Java 1~5 年程序员的建议
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • ${ }的特别功能
  • (1)(1.11) SiK Radio v2(一)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (20050108)又读《平凡的世界》
  • (bean配置类的注解开发)学习Spring的第十三天
  • (vue)页面文件上传获取:action地址
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)菜鸟学数据库(三)——存储过程
  • ***通过什么方式***网吧
  • .chm格式文件如何阅读
  • .NET 材料检测系统崩溃分析
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .Net下的签名与混淆
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .stream().map与.stream().flatMap的使用
  • @Not - Empty-Null-Blank
  • [AIGC] MySQL存储引擎详解
  • [Android]竖直滑动选择器WheelView的实现
  • [Android]通过PhoneLookup读取所有电话号码