All Projects → SelfZhangTQ → T Mvvm

SelfZhangTQ / T Mvvm

This repository contains a detailed sample app that implements MVVM architecture using LiveData,ViewModel,Retrofit,Rxjava

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to T Mvvm

Mentorship Android
Mentorship System is an application that matches women in tech to mentor each other, on career development, through 1:1 relations during a certain period of time. This is the Android application of this project.
Stars: ✭ 117 (-81.43%)
Mutual labels:  rxjava, mvvm, viewmodel, livedata
Android Jetpack Demo
🔥 快速入门Android Jetpack以及相关Kotlin、RxJava、MVVM等主流技术,独立构架App的基础技能
Stars: ✭ 335 (-46.83%)
Mutual labels:  rxjava, mvvm, viewmodel, livedata
Wanandroid
🏄 基于Architecture Components dependencies (Lifecycles,LiveData,ViewModel,Room)构建的WanAndroid开源项目。 你值得拥有的MVVM快速开发框架:https://github.com/jenly1314/MVVMFrame
Stars: ✭ 410 (-34.92%)
Mutual labels:  mvvm, viewmodel, livedata
DeezerClone
This Application using Dagger Hilt, Coroutines, Flow, Jetpack (Room, ViewModel, LiveData),Navigation based on MVVM architecture.
Stars: ✭ 81 (-87.14%)
Mutual labels:  mvvm, viewmodel, livedata
Weatherapp
5 Day Forecast app that works on Android and uses latest tools (Kotlin, Navigation, Room, LiveData, Databinding, Dagger 2)
Stars: ✭ 426 (-32.38%)
Mutual labels:  rxjava, mvvm, viewmodel
Jetpack Wanandroid
Kotlin+Jetpack+Coroutines+Retrofit+koin 完成的MVVM 组件化客户端 🔥🔥
Stars: ✭ 353 (-43.97%)
Mutual labels:  mvvm, viewmodel, livedata
Mvvmsmart
基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合ViewModel+Lifecycles+Navigation+DataBinding+LiveData+Okhttp+Retrofit+RxJava+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发高质量、易维护的Android应用。 项目组会持续维护,请放心使用.欢迎Start并Fork交流.
Stars: ✭ 382 (-39.37%)
Mutual labels:  mvvm, viewmodel, livedata
Mvvmarms
Android MVVM Architecture Components based on MVPArms and Android Architecture Components.
Stars: ✭ 425 (-32.54%)
Mutual labels:  mvvm, viewmodel, livedata
Mvvm Architecture Android Beginners
This repository contains a sample app that implements MVVM architecture using Kotlin, ViewModel, LiveData, and etc.
Stars: ✭ 176 (-72.06%)
Mutual labels:  rxjava, mvvm, livedata
Daggerandroidmvvm
Demonstrates using Dagger 2.11+ in MVVM app with Android Architecture Components, Clean Architecture, RxJava
Stars: ✭ 255 (-59.52%)
Mutual labels:  rxjava, mvvm, livedata
modern-android
Modern Android Project Skeleton
Stars: ✭ 17 (-97.3%)
Mutual labels:  rxjava, mvvm, viewmodel
Kotlinjetpackinaction
🔥🔥 Kotlin Jetpack zero to hero. 新手到高手
Stars: ✭ 264 (-58.1%)
Mutual labels:  mvvm, viewmodel, livedata
CoMvvmHelper
android mvvm 基础框架,适合日常快速开发。有需要添加的内容或者发现问题可以提 issue。
Stars: ✭ 26 (-95.87%)
Mutual labels:  mvvm, viewmodel, livedata
PlayAndroid
✌️✊👋玩安卓Mvvm组件化客户端,整合Jetpack组件DataBinding、ViewModel以及LiveData;屏幕适配✔️状态栏沉浸式✔️黑夜模式✔️,无数据、加载失败状态页;骨架屏、Koin依赖注入等
Stars: ✭ 193 (-69.37%)
Mutual labels:  mvvm, viewmodel, livedata
Relax
☘☘Relax 基于Kotlin语言编写的一套组件化框架,不紧整体组件化、内部也高度组件化🎋你可配置MVP、MVVM的开发模式、也可以配置所需要的业务组件🍁🍁
Stars: ✭ 253 (-59.84%)
Mutual labels:  rxjava, mvvm, livedata
AndroidGo
Android、Flutter 开发者帮助 APP。包含事件分发、性能分析、Google Jetpack组件、OkHttp、RxJava、Retrofit、Volley、Canvas绘制以及优秀博文代码案例等内容,帮助开发者快速上手!
Stars: ✭ 30 (-95.24%)
Mutual labels:  rxjava, mvvm, livedata
Mvvm Sample App
MVVM, ViewModel and LiveData Sample App
Stars: ✭ 498 (-20.95%)
Mutual labels:  mvvm, viewmodel, livedata
Android Clean Architecture Mvvm Dagger Rx
Implemented by Clean Architecture, Dagger2, MVVM, LiveData, RX, Retrofit2, Room, Anko
Stars: ✭ 138 (-78.1%)
Mutual labels:  rxjava, mvvm, livedata
Projectx
This repository might be a starting point for building Android interview tasks. There is also providing a basic sample template based on layered architecture using Dagger2 and Architecture Components.
Stars: ✭ 169 (-73.17%)
Mutual labels:  rxjava, viewmodel, livedata
StackOverFlowApi
working with Stack OverFlow Api
Stars: ✭ 24 (-96.19%)
Mutual labels:  mvvm, viewmodel, livedata

T-MVVM 努力打造简单实用的开发框架

艺术帮是一款艺术图片应用,采用LiveData+ViewModel+RxJava+okHttp+Retrofit+Glide架构的项目,仅用于学习交流,不断完善中

项目github地址:https://github.com/SelfZhangTQ/T-MVVM
apk下载地址

T-MVVM 2.0版本更新说明

 * 基于LiveBus事件除去ViewModel和Repository接口耦合。

项目初衷 在此之前一直使用MVP,MVP缺点:

  • Presenter中除了逻辑以外,还有大量的View->Model,Model->View的逻辑操作,造成Presenter臃肿,维护困难。
  • 对UI的渲染放在了Presenter中,所以UI和Presenter的交互会过于频繁。
  • Presenter过多地渲染了UI,往往会使得它与特定的UI的交互频繁。一旦UI变动,Presenter也需要变
  • 接口暴增,可以说代码量成倍增长,让人无法忍受,

MVVM的出现提高可维护性。解决了MVP大量的手动View和Model同步的问题,但并非救世主。没有最好的框架,只有最适合自己的,

此项目未使用:DataBinding原由

  • 数据绑定增加Bug调试难度。
  • 复杂的页面,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,不利于释放内存。
  • 数据双向绑定不利于View重用。

工程代码说明

image

无图无真相

image image
image image
image image

基于ViewModel,LiveData,Retrofit,Rxjava实现T-MVVM体系结构的架构,泛型限定,深度解耦。

ViewModel优点:
 * 同步关联生命周期,
 * 数据共享 ,
 * 复用性强 ,
LiveData优点:
 * 确保UI界面的数据状态,
 * 没有内存泄漏,不会因为Activity的不可见导致Crash,
 * 不用再人为的处理生命周期,
 * 共享资源,

此架构未使用DataBinding原由:

* 数据绑定增加Bug调试难度,
* 复杂的页面,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,不利于释放内存,
* 数据双向绑定不利于View重用,

###T-MVVM架构分层代码 1:先定义BaseViewModel基类

 /**
  * @author:tqzhang on 18/7/26 16:15
  */
  public class BaseViewModel<T extends BaseRepository> extends AndroidViewModel {

    public T mRepository;

    public BaseViewModel(@NonNull Application application) {
        super(application);
        mRepository = TUtil.getNewInstance(this, 0);
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        if (mRepository != null) {
           mRepository.unSubscribe();
        }

   }
 }

BaseViewModel通过泛型类型参数BaseRepository子类初始化Repository数据仓库,同时在activity/fragment走onDestroy()生命周期方法时 BaseViewModel回调onCleared,即页面销毁是用来取消网络请求或资源释放等操作。

正常开发一般不建议直接通过ViewModel获取网络数据,这里我们将工作交给一个新的模块Repository。Repository只负责数据处理,提供干净的api,方便切换数据来源。

2:再定义BaseRepository

public abstract class BaseRepository {

     protected ApiService apiService;

     public BaseRepository() {
             if (null == apiService) {
                 apiService = HttpHelper.getInstance().create(ApiService.class);
             }
     }

     private CompositeSubscription mCompositeSubscription;

     protected void addSubscribe(Subscription subscription) {
            if (mCompositeSubscription == null) {
                mCompositeSubscription = new CompositeSubscription();
            }
           mCompositeSubscription.add(subscription);
      }

     public void unSubscribe() {
             if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.clear();
    }
}

BaseRepository中内容相对简单,主要是获取ApiService和网络请求订阅容器,方便管理网络请求。

3:然后自定义AbsLifecycleFragment基类继承BaseFragment,BaseFragment可自行编写。如不需要使用T-MVVM,可自行继承BaseFragment,互不影响。

 public abstract class AbsLifecycleFragment<T extends BaseViewModel> extends BaseFragment  {

       protected T mViewModel;
       /**
        * init view
        * @param state
        */
       @Override
       public void initView(Bundle state) {
            mViewModel = VMProviders(this, TUtil.getInstance(this, 0));
          if (null != mViewModel) {
            dataObserver();
          }
       }

      /**
       * create ViewModelProviders
       *
       * @return ViewModel
       */
      protected <T extends ViewModel> T VMProviders(BaseFragment fragment, @NonNull Class<T> modelClass) {
           return ViewModelProviders.of(fragment).get(modelClass);
      }

      protected void dataObserver() {

      }

     /**
      * 获取网络数据
      */
      protected void getRemoteData() {

      }

    }

在initView方法中通过BaseViewModel子类泛型类型参数获取Class,在通过ViewModelProviders.of(fragment).get(modelClass))实例化ViewModel, 到此我们的基类基本编写完毕。

4:下面我们以一个简单业务实战下,获取文章列表。

4-1:ArticleFragment

/**
* @author:tqzhang on 18/7/2 14:40
*/
public class ArticleFragment extends AbsLifecycleFragment<ArticleViewModel> {
 protected TRecyclerView mRecyclerView;
 protected StaggeredGridLayoutManager layoutManager;
 protected DelegateAdapter adapter;

 public static ArticleFragment newInstance() {
    return new ArticleFragment();
 }

 @Override
 public int getLayoutResId() {
    return R.layout.fragment_list;
 }

 @Override
 public void initView(Bundle state) {
    super.initView(state);
    layoutManager=new new StaggeredGridLayoutManager(1,  StaggeredGridLayoutManager.VERTICAL);
    //获取网络数据
    getRemoteData();
 }

 //初始化adapter
 public void initAdapter(){
   adapter= new DelegateAdapter.Builder<>()
           .bindArray(ArticleInfoVo.class, new ArticleRem1ItemHolder(context)
            , new ArticleRem2ItemHolder(context)
            , new ArticleRem3ItemHolder(context))
           .bind(HeaderVo.class, new HeaderViewHolder(context, rogressStyle.Pacman))
           .bind(FootVo.class, new FootViewHolder(context, ProgressStyle.Pacman))
           .build();


 //数据观察
 @Override
 protected void dataObserver() {
    mViewModel.getArticleList().observe(this, articleVo -> {
        if (null != articleVo) {
           mRecyclerView.refreshComplete(articleVo.data.list, false);
        }
    });
 }
 //获取网络数据
 @Override
 protected void getRemoteData() {
     mViewModel.getArticleList(typeId, lastId);
 }
}

我们可以看出来ArticleFragment中只有UI初始化,发请网络请求action以及数据观察,列表展示用了TRecyclerView,欢迎star哦面向holder开发高复用,多类型的刷新库,从此只关心你的列表的Item展示。 通过泛型除去了MVP中通过接口传递信息的大量代码, 从此see you Mass implementation of interfaces。

4-1:ArticleViewModel

/**
* @author:tqzhang on 18/7/26 16:15
*/
public class ArticleViewModel extends BaseViewModel<ArticleRepository> {

     private MutableLiveData<ArticleVo> mArticleData;

     public ArticleViewModel(@NonNull Application application) {
          super(application);
     }

     public LiveData<ArticleVo> getArticleList() {
          if (mArticleData == null) {
              mArticleData = new MutableLiveData<>();
          }
         return mArticleData;
     }

    public void getArticleList(String lectureLevel1, String lastId) {
          mRepository.loadArticleRemList(new CallBack<ArticleVo>() {
        @Override
        public void onNext(ArticleVo articleObject) {
            mArticleData.postValue(articleObject);
        }

        @Override
        public void onError(String e) {

        }            }
    });
}

ArticleViewModel中持有数据观察容器LiveData和真正发起网络请求动作,在接收到服务端返回的数据通过 mArticleData.postValue(articleObject);通知Observer数据的更改,此处需注意的是,setValue方法只能在主线程中调用,postValue可以在任何线程中调用,如果是在后台子线程中更新LiveData的值,必须调用postValue。

4-3:ArticleRepository

/**
 * @author:tqzhang on 18/7/28 13:00
 */
 public class ArticleRepository extends BaseRepository {

      public void loadArticleRemList(final CallBack<ArticleVo> listener) {
          addSubscribe(apiService.getArticleRemList()
                .compose(RxSchedulers.io_main())
                .subscribe(new RxSubscriber<ArticleVo>() {

                    @Override
                    public void onSuccess(ArticleVo articleObject) {
                        listener.onNext(articleObject);
                    }

                    @Override
                    public void onFailure(String msg) {
                        listener.onError(msg);
                    }
            }));

}

最后我们的ArticleRepository中就提供数据,此处只提供了网络层的数据,在实际应用中可拆分类loacl data和remote data,可根据项目需求自行处理。

第三方库

  • okHttp
  • Retrofit
  • RxJava
  • LiveData
  • ViewModel
  • ButterKnife
  • Glide
  • Gson
  • BottomNavigationBar(轻量级底部导航栏)
  • LoadState (统一管理错误页面库)
  • gsyVideoPlayer(视频播放)
  • TRecyclerView (面向ViewHolder开发的刷新库,多类型item终结者,好不好用你试试就知道)
  • ...

声明

这个属于个人开发作品,仅做学习交流使用。诸位勿传播于非技术人员,拒绝用于商业用途,数据均属于非正常渠道获取。

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].