IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> MVVMbase类的封装,不用再手写了,直接继承实现它不香吗? -> 正文阅读

[移动开发]MVVMbase类的封装,不用再手写了,直接继承实现它不香吗?

前言:

本文是小编根据一位前辈封装的mvvm框架加入了自己的理解提炼的mvvm的base基类,单纯的为了方便,不需要再花时间手写base类,如有不足,欢迎大家留言,督促我改进代码。废话不多说,进入正文。

正文:

导入依赖:

application的build.gradle

 	maven { url 'https://jitpack.io' }

module的build.gradle

	android{
		dataBinding {
	    	    enabled = true
	    	}
	    }

别着急,还有

	    implementation 'com.github.xiangshu957:mvvm:0.0.7'
	
	    //okhttp、retrofit、rxjava
	    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
	    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
	    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
	    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
	    implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
	
	    //解决RxJava内存泄漏,但在联网请求的时候使用了liveData,其实已经解决了。观察事件不能取消。
	    //同时在单独使用rxJava的时候还是要用。比如在启动页,还未去主页面,手动点击返回键的时候有效
	    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
	    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

行了,赶紧锤一下你的项目吧,锤完咱们继续

application中初始化

		//context,sp文件的名字
        PreferenceUtil.getInstance().init(this, "test_sp");
        //baseUrl,api接口
        RetrofitManager.getInstance(SysCommon.BASE_URL, RetrofitApi.class);

实体类模板

这是一个实体类的模板,ResponseMode中已经有data、errorCode、errorMsg三个属性,分别对应返回的实体类对象、结果码、结果信息,因为不同的接口可能使用的字段不一样,所以需要重写setData()、setErrorCode()、setErrorMsg()以及isSuccess()方法,这样就可以适配各种网络请求可能会出现的场景了,切记一定要重写,不然可能会导致取不到值。

		public class ResponseModelCustom<T> extends ResponseModel<T> {
		
		    private int ret;
		    private T dataInfo;
		    private int errorType;
		    private String remark;
		
		    public void setDataInfo(T dataInfo) {
		        this.dataInfo = dataInfo;
		    }
		
		    public T getDataInfo() {
		        return getData();
		    }
		
		    public int getRet() {
		        return ret;
		    }
		
		    public void setRet(int ret) {
		        this.ret = ret;
		    }
		
		    public int getErrorType() {
		        return errorType;
		    }
		
		    public void setErrorType(int errorType) {
		        this.errorType = errorType;
		    }
		
		    public String getRemark() {
		        return remark;
		    }
		
		    public void setRemark(String remark) {
		        this.remark = remark;
		    }
		
		    @Override
		    public boolean isSuccess() {
		        return super.isSuccess();
		    }
		
		    @Override
		    public T getData() {
		        if (dataInfo != null) {
		            return dataInfo;
		        }
		        return super.getData();
		    }
		}

RepositoryImpl网络请求都写到这里

		public class RepositoryImpl extends BaseModel {
		
		    //这里放的是所有的网络请求操作
		
		    public MutableLiveData<Resource<List<TestBean>>> getData(){
		        MutableLiveData<Resource<List<TestBean>>> liveData = new MutableLiveData<>();
		        //observeGo()是BaseModel中封装的方法,大家可以点进去看看
		        return observeGo(((RetrofitApi)getApiService()).getData(),liveData);
		    }
		
		}

viewModel获取数据

这里写的就是单独的activity或者fragment所需要的获取数据的方法

		public class MainViewModel extends BaseViewModel<RepositoryImpl> {
		
		    public MainViewModel(@NonNull Application application) {
		        super(application);
		    }
		
		    @Override
		    protected RepositoryImpl createRepository(RepositoryImpl repository) {
		        if (repository == null) {
		            repository = new RepositoryImpl();
		        }
		        return repository;
		    }
		
		    public MutableLiveData<Resource<List<TestBean>>> getData() {
		        return ((RepositoryImpl) getRepository()).getData();
		    }
		}

Activity中的业务逻辑

activity继承BaseActivity并通过泛型传入对应的ViewModel和Binding,然后通过mViewModel获取到的liveData监测数据的改变,从而更新Ui。

		public class MainActivity extends BaseActivity<MainViewModel, ActivityMainBinding> {
		
		
		    @Override
		    protected int getContentViewId() {
		    	//获取布局文件
		        return R.layout.activity_main;
		    }
		
		    @Override
		    protected void processLogic() {
		    	//业务逻辑
		        mViewModel.getData().observe(this, listResource -> {
		            listResource.handler(new OnCallback<List<TestBean>>() {
		
		                @Override
		                public void onSuccess(List<TestBean> data) {
		                    String ser = GsonUtils.ser(data);
		                    LogUtils.e("zrx", ser);
		                }
		
		                @Override
		                public void onFail(String msg) {
		                    super.onFail(msg);
		                    LogUtils.e("zrx", msg);
		                }
		            });
		
		        });
		    }
		
		    @Override
		    protected void setListener() {
				//设置监听
		    }
		
		    @Override
		    protected void showDialog(String msg) {
				//展示弹框提示
		    }
		
		    @Override
		    protected void hideDialog() {
				//隐藏弹框
		    }
		
		    @Override
		    protected void registerBroadCast() {
				//注册广播
		    }
		
		    @Override
		    protected void unRegisterBroadCast() {
				//注销广播
		    }
		}

源码地址

结语

本次分享到此就结束了,有些地方还在考虑如何修改中,后续会陆续跟大家见面的,如有建议,请留言

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:57:51  更:2021-11-26 08:59:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:33:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码