android studio int转,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

01ec542ffec9ba0b3f0cf89801cf7360.png

Paste_Image.png

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

675c32e987668c404abbb8c3095f30b0.png

Paste_Image.png

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

android {

...

productFlavors {

prod {

}

mock {

}

}

}

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

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

cda6b83776ef62b072e28464e907cdbe.png

Paste_Image.png

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

0a2e36a76b12f559147d6c845f08330d.png

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

13c4f6b7fcbb8a3b41d2947a40101436.png

Paste_Image.png

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

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

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

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

b10c9e8f13ec49250e46f9c4f8f3e467.png

Paste_Image.png

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

3e42b0bf6e9563c53d15664a18939898.png

Paste_Image.png

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

b1d88f8042dd8c1a6899ad25fa32d273.png

Paste_Image.png

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

c18b23153096d69acbb1236df82f6d27.png

Paste_Image.png

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

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

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

最后画风是这样的:

f546bec77df5abcca7d119f352962d31.png

Paste_Image.png

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

61752544fc102edab36073a7ec9025c7.png

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跟你调,哈哈,妈妈再也不用担心我调接口了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值