google官方MVVM框架讲解我前面对比了MVC和MVP《两张图看懂Android开发中MVC与MVP的区别》,可以相对于 其中只有
MVVM架构优势《两张图看懂Android开发中MVC与MVP的区别》 前面两张图真是了MVC和MVP的区别,我这里也来一张图看看MVVM: 看上图 MVVM优势总结:
MVVM组件化示例项目架构分析下图是项目模块和工程之间的依赖关系: 下图是工程Android Studio中的目录结构: 各模块和彼此之间的关系解释:
ARouter串联各个模块使用 ARouter典型应用
组件化编译和非组件化编译切换我们在工程根目录下的 # 每次更改“isModule”的值后,需要点击 "Sync Project" 按钮 # isModule是“集成开发模式”和“组件开发模式”的切换开关 isModule=false 然后在 if (isModule.toBoolean()) { //组件化编译时为application apply plugin: 'com.android.application' } else { //非组件化编译时为library apply plugin: 'com.android.library' } android { compileSdkVersion build_versions.target_sdk buildToolsVersion build_versions.build_tools defaultConfig { minSdkVersion build_versions.min_sdk targetSdkVersion build_versions.target_sdk versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //ARouter javaCompileOptions { annotationProcessorOptions { arguments = [moduleName: project.getName()] } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dataBinding { enabled = true } lintOptions { abortOnError false } sourceSets { main { if (isModule.toBoolean()) { //组件化编译时为app,在对应的AndroidManifest文件中需要写ndroid.intent.action.MAIN入口Activity manifest.srcFile 'src/main/module/AndroidManifest.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' //集成开发模式下排除debug文件夹中的所有Java文件 java { //debug文件夹中放的是Application类,非组件化时不用有此类 exclude 'debug/**' } } } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) api project(':lib_coremodel') api project(':lib_common') implementation 'com.android.support:support-v4:26.1.0' annotationProcessor deps.arouter.compiler } 上面看到了组件化和非组件化编译会有不用的
最后预告后面会有一些列介绍在 下面贴贴一个 package google.architecture.coremodel.viewmodel; import android.app.Application; import android.arch.lifecycle.AndroidViewModel; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.MutableLiveData; import android.databinding.ObservableField; import android.support.annotation.NonNull; import java.io.IOException; import java.lang.reflect.ParameterizedType; import google.architecture.coremodel.datamodel.http.ApiClient; import google.architecture.coremodel.datamodel.http.ApiConstants; import google.architecture.coremodel.datamodel.http.service.DynamicApiService; import google.architecture.coremodel.util.JsonUtil; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; /** * Created by dxx on 2017/11/20. */ public class BaseViewModel<T> extends AndroidViewModel { //生命周期观察的数据 private MutableLiveData<T> liveObservableData = new MutableLiveData<>(); //UI使用可观察的数据 ObservableField是一个包装类 public ObservableField<T> uiObservableData = new ObservableField<>(); private final CompositeDisposable mDisposable = new CompositeDisposable(); private static final MutableLiveData ABSENT = new MutableLiveData(); { //noinspection unchecked ABSENT.setValue(null); } public BaseViewModel(@NonNull Application application, String fullUrl) { super(application); ApiClient.initService(ApiConstants.GankHost, DynamicApiService.class).getDynamicData(fullUrl).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { mDisposable.add(d); } @Override public void onNext(ResponseBody value) { if(null != value){ try { liveObservableData.setValue(JsonUtil.Str2JsonBean(value.string(), getTClass())); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } /** * LiveData支持了lifecycle生命周期检测 * @return */ public LiveData<T> getLiveObservableData() { return liveObservableData; } /** * 当主动改变数据时重新设置被观察的数据 * @param product */ public void setUiObservableData(T product) { this.uiObservableData.set(product); } public Class<T> getTClass(){ Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; return tClass; } @Override protected void onCleared() { super.onCleared(); mDisposable.clear(); } }
|
|