Android Studio Flavors的妙用

來源:互聯網
上載者:User

標籤:this   turn   happy   圖片   ctf   伺服器   shu   用法   cti   

這兩天發現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的妙用(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.