Skip to content

Commit 8b5639f

Browse files
committed
支持配置多个BaseUrl,且支持动态改变
1 parent 582207a commit 8b5639f

File tree

30 files changed

+483
-88
lines changed

30 files changed

+483
-88
lines changed

README.md

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
![Image](app/src/main/ic_launcher-web.png)
44

55
[![Download](https://img.shields.io/badge/download-App-blue.svg)](https://raw.githubusercontent.com/jenly1314/MVVMFrame/master/app/release/app-release.apk)
6-
[![JCenter](https://img.shields.io/badge/JCenter-1.1.2-46C018.svg)](https://bintray.com/beta/#/jenly/maven/mvvmframe)
6+
[![JCenter](https://img.shields.io/badge/JCenter-1.1.3-46C018.svg)](https://bintray.com/beta/#/jenly/maven/mvvmframe)
77
[![JitPack](https://jitpack.io/v/jenly1314/MVVMFrame.svg)](https://jitpack.io/#jenly1314/MVVMFrame)
88
[![CI](https://travis-ci.org/jenly1314/MVVMFrame.svg?branch=master)](https://travis-ci.org/jenly1314/MVVMFrame)
99
[![CircleCI](https://circleci.com/gh/jenly1314/MVVMFrame.svg?style=svg)](https://circleci.com/gh/jenly1314/MVVMFrame)
@@ -12,7 +12,7 @@
1212
[![Blog](https://img.shields.io/badge/blog-Jenly-9933CC.svg)](https://jenly1314.github.io/)
1313
[![QQGroup](https://img.shields.io/badge/QQGroup-20867961-blue.svg)](http://shang.qq.com/wpa/qunwpa?idkey=8fcc6a2f88552ea44b1411582c94fd124f7bb3ec227e2a400dbbfaad3dc2f5ad)
1414

15-
MVVMFrame for Android 是一个基于Google官方推出的Architecture Components dependenciesLifecycle,LiveData,ViewModel,Room构建的快速开发框架。有了MVVMFrame的加持,从此构建一个MVVM模式的项目变得快捷简单。
15+
MVVMFrame for Android 是一个基于Google官方推出的Architecture Components dependencies(现在叫JetPack){Lifecycle,LiveData,ViewModel,Room}构建的快速开发框架。现在应该叫JetPack。有了MVVMFrame的加持,从此构建一个MVVM模式的项目变得快捷简单。
1616

1717
## 架构
1818
![Image](image/mvvm_architecture.jpg)
@@ -26,30 +26,30 @@ MVVMFrame for Android 是一个基于Google官方推出的Architecture Component
2626
<dependency>
2727
<groupId>com.king.frame</groupId>
2828
<artifactId>mvvmframe</artifactId>
29-
<version>1.1.2</version>
29+
<version>1.1.3</version>
3030
<type>pom</type>
3131
</dependency>
3232
```
3333
### Gradle:
3434
```gradle
3535
//AndroidX 版本
36-
implementation 'com.king.frame:mvvmframe:1.1.2'
36+
implementation 'com.king.frame:mvvmframe:1.1.3'
3737
3838
//Android 版本
3939
implementation 'com.king.frame:mvvmframe:1.0.2'
4040
```
4141
### Lvy:
4242
```lvy
43-
<dependency org='com.king.frame' name='mvvmframe' rev='1.1.2'>
43+
<dependency org='com.king.frame' name='mvvmframe' rev='1.1.3'>
4444
<artifact name='$AID' ext='pom'></artifact>
4545
</dependency>
4646
```
4747

4848
### **Dagger****Room** 的注解处理器
4949

50-
您需要引入下面的列出的编译时的注解处理器,用于自动生成相关代码。其它对应版本具体详情可查看 [Versions](https://github.com/jenly1314/MVVMFrame/releases)
50+
你需要引入下面的列出的编译时的注解处理器,用于自动生成相关代码。其它对应版本具体详情可查看 [Versions](https://github.com/jenly1314/MVVMFrame/releases)
5151
```gradle
52-
//AndroidX ------------------ MVVMFrame v1.1.2
52+
//AndroidX ------------------ MVVMFrame v1.1.3
5353
//dagger
5454
annotationProcessor 'com.google.dagger:dagger-android-processor:2.27'
5555
annotationProcessor 'com.google.dagger:dagger-compiler:2.27'
@@ -119,7 +119,7 @@ dataBinding {
119119
120120
```
121121

122-
Step.2 使用JDK8编译(v1.1.2新增),在你项目中的build.gradle的android{}中添加配置:
122+
Step.2 使用JDK8编译(v1.1.3新增),在你项目中的build.gradle的android{}中添加配置:
123123
```gradle
124124
compileOptions {
125125
targetCompatibility JavaVersion.VERSION_1_8
@@ -128,8 +128,8 @@ compileOptions {
128128
129129
```
130130

131-
Step.3 自定义全局配置(继承MVVMFrame中的FrameConfigModule)
132-
```Java
131+
Step.3 自定义全局配置(继承MVVMFrame中的FrameConfigModule)(提示:如果你没有自定义配置的需求,可以直接忽略此步骤)
132+
```java
133133
/**
134134
* 自定义全局配置
135135
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
@@ -168,15 +168,15 @@ public class AppConfigModule extends FrameConfigModule {
168168
}
169169
```
170170

171-
Step.4 在你项目中的AndroidManifest.xml中通过配置meta-data来自定义全局配置
172-
```Xml
171+
Step.4 在你项目中的AndroidManifest.xml中通过配置meta-data来自定义全局配置(提示:如果你没有自定义配置的需求,可以直接忽略此步骤)
172+
```xml
173173
<!-- MVVMFrame 全局配置 -->
174174
<meta-data android:name="com.king.mvvmframe.app.config.AppConfigModule"
175175
android:value="FrameConfigModule"/>
176176
```
177177

178-
Step.4 用你项目的Application继承MVVMFrame中的BaseApplication
179-
```Java
178+
Step.5 用你项目的Application继承MVVMFrame中的BaseApplication
179+
```java
180180
/**
181181
* MVVMFrame 框架基于Google官方的Architecture Components dependencies 构建,在使用MVVMFrame时,需遵循一些规范:
182182
* 1.你的项目中的Application中需初始化MVVMFrame框架相关信息,有两种方式处理:
@@ -190,8 +190,10 @@ public class App extends BaseApplication {
190190

191191
@Override
192192
public void onCreate() {
193+
//TODO 如果默认配置已经能满足你的需求,你不需要自定义配置,可以通过下面注释掉的方式设置 BaseUrl,从而可以省略掉 step3 , setp4 两个步骤。
194+
// RetrofitHelper.getInstance().setBaseUrl(baseUrl);
193195
super.onCreate();
194-
//开始构建项目时,DaggerApplicationComponent类可能不存在,您需要执行Make Project才能生成,Make Project快捷键 Ctrl + F9
196+
//开始构建项目时,DaggerApplicationComponent类可能不存在,你需要执行Make Project才能生成,Make Project快捷键 Ctrl + F9
195197
ApplicationComponent appComponent = DaggerApplicationComponent.builder()
196198
.appComponent(getAppComponent())
197199
.build();
@@ -204,6 +206,30 @@ public class App extends BaseApplication {
204206
}
205207
```
206208

209+
> 目前通过设置 BaseUrl 的入口主要有两种:
210+
>> 1.一种是通过在 Manifest 中配置 meta-data 的来自定义 FrameConfigModule,在里面 通过 {@link ConfigModule.Builder#baseUrl(String)}来配置 BaseUrl。(一次设置,全局配置)
211+
>
212+
>> 2.一种就是通过RetrofitHelper {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来配置 BaseUrl。(可多次设置,动态全局配置,有前提条件)
213+
>
214+
> 以上两种配置 BaseUrl 的方式都可以达到目的。但是你可以根据不同的场景选择不同的配置方式。
215+
>
216+
> 主要场景与选择如下:
217+
>
218+
>> 一般场景:对于只使用单个不变的 BaseUrl的
219+
>>> 场景1:如果本库的默认已满足你的需求,无需额外自定义配置的。
220+
> 选择:建议你直接使用 {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来初始化 BaseUrl,切记在框架配置初始化之前,即你的 {@link Application#onCreate()}的父类onCreate之前设置。
221+
>
222+
>>> 场景2:如果本库的默认配置不满足你的需求,你需要自定义一些配置的。(比如需要使用 RxJava相关)
223+
> 选择:建议你在自定义配置中通过 {@link ConfigModule.Builder#baseUrl(String)} 来初始化 BaseUrl。
224+
>
225+
>> 二般场景:对于只使用单个 BaseUrl 但是,BaseUrl中途会变动的。
226+
>>> 场景3:和一般场景一样,也能分两种,所以选择也和一般场景也可以是一样的。
227+
> 选择:两种选择都行,但当 BaseUrl需要中途变动时,还需将 {@link RetrofitHelper#setDynamicDomain(boolean)} 设置为 {@code true} 才能支持动态改变 BaseUrl。
228+
>
229+
>> 特殊场景:对于支持多个 BaseUrl 且支持动态可变的。
230+
>>> 选择:这个场景的选择,主要涉及到另外的方法,请查看 {@link RetrofitHelper#putDomain(String, String)} 和 {@link RetrofitHelper#putDomain(String, HttpUrl)}相关详情
231+
>
232+
207233
[Kotlin Demo](https://github.com/jenly1314/KingWeather)
208234

209235
更多使用详情,请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/projects/MVVMFrame/doc/)
@@ -213,9 +239,21 @@ public class App extends BaseApplication {
213239
##### [EasyChat](https://github.com/yetel/EasyChatAndroidClient) 一款即时通讯APP
214240
##### [AppTemplate](https://github.com/jenly1314/AppTemplate) 一款基于**MVVMFrame**构建的App模板
215241

242+
## 压缩与混淆
243+
244+
**Android Studio 3.3+**之后,AS新增特性代码压缩工具**R8****R8**旨在集成**ProGuard****D8**的功能。
245+
目前推荐第三方库都自己配置混淆规则,这样在混淆时,如果使用**R8**,则可以直接包含第三方依赖库的混淆规则,就不用繁琐的去配置每个依赖库的混淆规则。
246+
247+
目前**MVVFrame**所有依赖混淆规则详情:[ProGuard rules](lib/proguard-rules.pro)
216248

217249
## 版本记录
218250

251+
#### v1.1.3:2020-6-1
252+
* 支持配置多个BaseUrl,且支持动态改变(详情查看 [RetrofitHelper](https://github.com/jenly1314/RetrofitHelper)
253+
* 对外暴露更多配置,(详情查看 FrameConfigModule)
254+
* 优化细节
255+
* 更新Retrofit至v2.9.0
256+
219257
#### v1.1.2:2020-4-5
220258
* 优化细节
221259
* 更新Gradle至v5.6.4
@@ -250,8 +288,8 @@ public class App extends BaseApplication {
250288
* MVVMFrame初始版本
251289

252290
## 赞赏
253-
如果您喜欢MVVMFrame,或感觉MVVMFrame帮助到了您,可以点右上角“Star”支持一下,您的支持就是我的动力,谢谢 :smiley:<p>
254-
您也可以扫描下面的二维码,请作者喝杯咖啡 :coffee:
291+
如果你喜欢MVVMFrame,或感觉MVVMFrame帮助到了你,可以点右上角“Star”支持一下,你的支持就是我的动力,谢谢 :smiley:<p>
292+
你也可以扫描下面的二维码,请作者喝杯咖啡 :coffee:
255293
<div>
256294
<img src="https://jenly1314.github.io/image/pay/wxpay.png" width="280" heght="350">
257295
<img src="https://jenly1314.github.io/image/pay/alipay.png" width="280" heght="350">

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ android {
3939

4040
dependencies {
4141
implementation fileTree(include: ['*.jar'], dir: 'libs')
42+
4243
testImplementation deps.test.junit
44+
androidTestImplementation deps.test.android_junit
45+
androidTestImplementation deps.test.test
4346
androidTestImplementation deps.test.runner
4447
androidTestImplementation deps.test.espresso
4548

app/release/app-release.apk

-1.01 KB
Binary file not shown.

app/release/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":6,"versionName":"1.1.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]
1+
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":7,"versionName":"1.1.3","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]

app/src/androidTest/java/com/king/mvvmframe/ExampleInstrumentedTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.king.mvvmframe;
22

33
import android.content.Context;
4-
import android.support.test.InstrumentationRegistry;
5-
import android.support.test.runner.AndroidJUnit4;
64

75
import org.junit.Test;
86
import org.junit.runner.RunWith;
97

8+
import androidx.test.ext.junit.runners.AndroidJUnit4;
9+
import androidx.test.platform.app.InstrumentationRegistry;
10+
1011
import static org.junit.Assert.*;
1112

1213
/**
@@ -19,7 +20,7 @@ public class ExampleInstrumentedTest {
1920
@Test
2021
public void useAppContext() {
2122
// Context of the app under test.
22-
Context appContext = InstrumentationRegistry.getTargetContext();
23+
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
2324

2425
assertEquals("com.king.mvvmframe", appContext.getPackageName());
2526
}

app/src/main/java/com/king/mvvmframe/App.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.king.mvvmframe.app.Constants;
77
import com.king.mvvmframe.di.component.ApplicationComponent;
88
import com.king.mvvmframe.di.component.DaggerApplicationComponent;
9+
import com.king.retrofit.retrofithelper.RetrofitHelper;
910
import com.orhanobut.logger.AndroidLogAdapter;
1011
import com.orhanobut.logger.FormatStrategy;
1112
import com.orhanobut.logger.Logger;
@@ -52,6 +53,7 @@ protected void attachBaseContext(Context base) {
5253

5354
@Override
5455
public void onCreate() {
56+
// RetrofitHelper.getInstance().setBaseUrl("https://google.com");
5557
super.onCreate();
5658

5759
//开始构建项目时,DaggerApplicationComponent类可能不存在,您需要执行Make Project才能生成,Make Project快捷键 Ctrl + F9
@@ -61,6 +63,11 @@ public void onCreate() {
6163
//注入
6264
appComponent.inject(this);
6365

66+
//TODO 动态新增多个 BaseUrl 示例
67+
//支持多个并且动态切换 BaseUrl
68+
RetrofitHelper.getInstance().putDomain(Constants.DOMAIN_JENLY,"https://jenly1314.github.io");
69+
// RetrofitHelper.getInstance().putDomain("Google","https://google.com");
70+
6471
}
6572

6673

app/src/main/java/com/king/mvvmframe/MainActivity.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,24 @@
33
import android.os.Bundle;
44
import android.view.View;
55

6+
import com.king.base.util.ToastUtils;
67
import com.king.frame.mvvmframe.base.BaseActivity;
7-
import com.king.frame.mvvmframe.base.DataViewModel;
88
import com.king.mvvmframe.app.likepoetry.LikePoetryActivity;
99
import com.king.mvvmframe.app.poetry.PoetryActivity;
1010
import com.king.mvvmframe.app.poetrylite.PoetryLiteActivity;
1111
import com.king.mvvmframe.databinding.MainActivityBinding;
1212

13+
import java.util.List;
14+
import java.util.Map;
15+
1316
import androidx.annotation.Nullable;
17+
import timber.log.Timber;
1418

15-
public class MainActivity extends BaseActivity<DataViewModel,MainActivityBinding> {
19+
/**
20+
* 因为目前Demo测试BaseUrl诗词已经不能用了,所以会请求不到数据,但是MVVM的相关结构与分层还是有参考意义的
21+
* REAMDE上面有MVVMFrame相关的开源项目,也可以参考。后续,考虑重新写个Demo
22+
*/
23+
public class MainActivity extends BaseActivity<MainViewModel,MainActivityBinding> {
1624

1725
@Override
1826
public int getLayoutId() {
@@ -22,6 +30,14 @@ public int getLayoutId() {
2230
@Override
2331
public void initData(@Nullable Bundle savedInstanceState) {
2432

33+
34+
registerMessageEvent(message -> {
35+
Timber.d("message:%s" , message);
36+
ToastUtils.showToast(getContext(), message);
37+
});
38+
getViewModel().getLiveDataCities().observe(this, it -> {
39+
ToastUtils.showToast(getContext(), it.toString());
40+
});
2541
}
2642

2743
public void onClick(View v){
@@ -35,6 +51,9 @@ public void onClick(View v){
3551
case R.id.btn3:
3652
startActivity(LikePoetryActivity.class);
3753
break;
54+
case R.id.btn4:
55+
getViewModel().getHotCities();
56+
break;
3857
}
3958
}
4059
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.king.mvvmframe;
2+
3+
import android.app.Application;
4+
5+
import com.king.frame.mvvmframe.base.BaseModel;
6+
import com.king.frame.mvvmframe.base.DataViewModel;
7+
import com.king.frame.mvvmframe.base.livedata.StatusEvent;
8+
import com.king.frame.mvvmframe.http.callback.ApiCallback;
9+
import com.king.mvvmframe.api.ApiService;
10+
import com.king.mvvmframe.bean.PoetryInfo;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
import javax.inject.Inject;
16+
17+
import androidx.annotation.NonNull;
18+
import androidx.lifecycle.MutableLiveData;
19+
import retrofit2.Call;
20+
21+
/**
22+
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
23+
*/
24+
public class MainViewModel extends DataViewModel {
25+
26+
private MutableLiveData<List<Map<String,Object>>> liveDataCities = new MutableLiveData<>();
27+
28+
@Inject
29+
public MainViewModel(@NonNull Application application, BaseModel model) {
30+
super(application, model);
31+
}
32+
33+
34+
public void getHotCities(){
35+
showLoading();
36+
getRetrofitService(ApiService.class).getHotCities().enqueue(new ApiCallback<List<Map<String, Object>>>() {
37+
@Override
38+
public void onResponse(Call<List<Map<String, Object>>> call, List<Map<String, Object>> result) {
39+
if (result != null) {
40+
liveDataCities.postValue(result);
41+
}else{
42+
postMessage(R.string.result_failure);
43+
}
44+
postHideLoading();
45+
}
46+
47+
@Override
48+
public void onError(Call<List<Map<String, Object>>> call, Throwable t) {
49+
postMessage(t.getMessage());
50+
postHideLoading();
51+
}
52+
});
53+
}
54+
55+
public MutableLiveData<List<Map<String,Object>>> getLiveDataCities(){
56+
return liveDataCities;
57+
}
58+
}

app/src/main/java/com/king/mvvmframe/api/ApiService.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.king.mvvmframe.api;
22

3+
import com.king.mvvmframe.app.Constants;
34
import com.king.mvvmframe.bean.PoetryInfo;
45
import com.king.mvvmframe.bean.Result;
6+
import com.king.retrofit.retrofithelper.DomainName;
7+
import com.king.retrofit.retrofithelper.Timeout;
58

69
import java.util.List;
10+
import java.util.Map;
711

812
import retrofit2.Call;
913
import retrofit2.http.GET;
1014
import retrofit2.http.POST;
1115
import retrofit2.http.Query;
1216

17+
1318
/**
1419
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
1520
*/
@@ -30,4 +35,15 @@ public interface ApiService {
3035
*/
3136
@POST("poetry/poetrys/searchPoetry")
3237
Call<Result<List<PoetryInfo>>> searchPoetry(@Query("keyword")String keyword,@Query("page")int page);
38+
39+
40+
/**
41+
* 动态改变 BaseUrl 示例
42+
* @return
43+
*/
44+
@DomainName(Constants.DOMAIN_JENLY)
45+
@Timeout(connectTimeout = 14,readTimeout = 15,writeTimeout = 14)
46+
@GET("api/city/hotCities.json")
47+
Call<List<Map<String,Object>>> getHotCities();
48+
3349
}

app/src/main/java/com/king/mvvmframe/app/Constants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ public final class Constants {
1818

1919
public static final int COLOR_RGB_MIN = 20;
2020
public static final int COLOR_RGB_MAX = 230;
21+
22+
23+
public static final String DOMAIN_JENLY = "jenly1314";
2124
}

0 commit comments

Comments
 (0)