package com.doumee.lib_coremodel.base;
|
|
import android.app.Application;
|
import android.os.Bundle;
|
import android.os.Message;
|
import android.view.View;
|
|
import androidx.annotation.MainThread;
|
import androidx.annotation.NonNull;
|
import androidx.annotation.StringRes;
|
import androidx.databinding.ObservableField;
|
import androidx.databinding.ObservableInt;
|
import androidx.hilt.lifecycle.ViewModelInject;
|
import androidx.lifecycle.AndroidViewModel;
|
import androidx.lifecycle.Lifecycle;
|
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.Observer;
|
|
import com.doumee.lib_coremodel.base.livedata.ActionEvent;
|
import com.doumee.lib_coremodel.base.livedata.MessageEvent;
|
import com.doumee.lib_coremodel.base.livedata.SingleLiveEvent;
|
import com.doumee.lib_coremodel.base.livedata.StatusEvent;
|
import com.doumee.lib_coremodel.bean.event.ActionEventData;
|
import com.doumee.lib_coremodel.binding.command.BindingAction;
|
import com.doumee.lib_coremodel.binding.command.BindingCommand;
|
import com.doumee.lib_coremodel.binding.command.BindingConsumer;
|
import com.doumee.lib_coremodel.http.rxJava.RxJavaGcManager;
|
|
import java.util.HashMap;
|
|
|
/**
|
* MVVMFrame 框架基于Google官方的 JetPack 构建,在使用MVVMFrame时,需遵循一些规范:
|
*
|
* 如果您继承使用了BaseViewModel或其子类,你需要参照如下方式在构造函数上添加@ViewModelInject注解
|
*
|
* @example BaseViewModel
|
* //-------------------------
|
* public class YourViewModel extends BaseViewModel<YourModel> {
|
* @ViewModelInject
|
* public DataViewModel(@NonNull Application application, YourModel model) {
|
* super(application, model);
|
* }
|
* }
|
* //-------------------------
|
*
|
* 如果您继承使用了BaseModel或其子类,你需要参照如下方式在构造函数上添加@Inject注解
|
*
|
* @example BaseModel
|
* //-------------------------
|
* public class YourModel extends BaseModel {
|
* @Inject
|
* public BaseModel(IDataRepository dataRepository){
|
* super(dataRepository);
|
* }
|
* }
|
* //-------------------------
|
*
|
*
|
* 标准MVVM模式中的VM (ViewModel)层基类
|
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
|
*/
|
public class BaseViewModel<M extends BaseModel> extends AndroidViewModel implements IViewModel {
|
|
public ObservableField<String> title=new ObservableField<>("121");
|
public ObservableField<String> saveStr=new ObservableField<>("保存");
|
/**
|
* 显示保存
|
* */
|
public ObservableInt saveStrvisibility = new ObservableInt(View.GONE);
|
/**
|
* 到底
|
*/
|
public ObservableInt loadMoreVisibility = new ObservableInt(View.GONE); /**
|
* 无数据
|
*/
|
public ObservableInt emptyVisibility = new ObservableInt(View.VISIBLE);
|
public RxJavaGcManager rxJavaGcManager;//网络请求生命控制
|
protected String tag;
|
|
/**
|
* 返回事件
|
* */
|
public BindingCommand backOnClickCommand=new BindingCommand(new BindingAction() {
|
@Override
|
public void call() {
|
backOnClickCommand();
|
}
|
});
|
/**
|
* 保存事件
|
* */
|
public BindingCommand saveOnClickCommand=new BindingCommand(new BindingAction() {
|
@Override
|
public void call() {
|
saveOnClickCommand();
|
}
|
});
|
public void backOnClickCommand(){
|
finish();
|
}
|
public void saveOnClickCommand(){
|
|
}
|
|
public BindingCommand myTypeCommand = new BindingCommand(new BindingConsumer<Integer>() {
|
@Override
|
public void call(Integer type) {
|
clickByTypeCommand(type);
|
}
|
});
|
|
protected void clickByTypeCommand(int type){
|
|
}
|
|
public String getTag() {
|
return tag;
|
}
|
|
public void setTag(String tag) {
|
this.tag = tag;
|
}
|
|
private LifecycleOwner lifecycleOwner;
|
|
/**
|
* 请通过 {@link #getModel()} 获取,后续版本 {@link #mModel}可能会私有化
|
*/
|
private M mModel;
|
|
/**
|
* 动作事件
|
*/
|
private ActionEvent actionEvent = new ActionEvent();
|
|
/**
|
* 消息事件
|
*/
|
private MessageEvent mMessageEvent = new MessageEvent();
|
|
/**
|
* 状态事件
|
*/
|
private StatusEvent mStatusEvent = new StatusEvent();
|
|
/**
|
* 加载状态
|
*/
|
private SingleLiveEvent<Boolean> mLoadingEvent = new SingleLiveEvent<>();
|
|
/**
|
* 提供自定义单一消息事件
|
*/
|
private SingleLiveEvent<Message> mSingleLiveEvent = new SingleLiveEvent<>();
|
|
/**
|
* 继承者都将使用此构造
|
* @param application
|
* @param model
|
*/
|
public BaseViewModel(@NonNull Application application, M model) {
|
super(application);
|
this.mModel = model;
|
rxJavaGcManager=new RxJavaGcManager();
|
}
|
|
/**
|
* 特殊构造,仅供内部使用
|
* 为了满足@ViewModelInject注解
|
* @param application
|
*/
|
@ViewModelInject
|
BaseViewModel(@NonNull Application application) {
|
super(application);
|
|
}
|
|
@Override
|
public void onCreate() {
|
|
}
|
|
@Override
|
public void onStart() {
|
|
}
|
|
@Override
|
public void onResume() {
|
|
}
|
|
@Override
|
public void onPause() {
|
|
}
|
|
@Override
|
public void onStop() {
|
|
}
|
|
@Override
|
public void onDestroy() {
|
if(mModel != null){
|
mModel.onDestroy();
|
mModel = null;
|
}
|
rxJavaGcManager.disposableActives();
|
}
|
|
@Override
|
public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
|
|
}
|
|
public void finish(){
|
actionEvent.setValue(new ActionEventData(ActionEvent.Action.FINISH,new HashMap<>()));
|
}
|
|
public void toast(String msg){
|
actionEvent.setValue(new ActionEventData(ActionEvent.Action.TOAST,"toast",msg));
|
}
|
|
public void doAction(int type){
|
actionEvent.setValue(new ActionEventData(type));
|
}
|
|
public LifecycleOwner getLifecycleOwner() {
|
return lifecycleOwner;
|
}
|
|
public void setLifecycleOwner(LifecycleOwner lifecycleOwner) {
|
this.lifecycleOwner = lifecycleOwner;
|
}
|
|
/**
|
* {@link M}
|
* @return {@link #mModel}
|
*/
|
public M getModel(){
|
return this.mModel;
|
}
|
|
public ActionEvent getActionEvent() {
|
return actionEvent;
|
}
|
|
public void updateAction(ActionEventData data, boolean post){
|
if(post){
|
actionEvent.postValue(data);
|
}else{
|
actionEvent.setValue(data);
|
}
|
}
|
|
public void startActivity(Class<?> cla, Bundle bundle){
|
HashMap<String,Object> hashMap=new HashMap<>();
|
hashMap.put(ActionEvent.ParameterField.CLASS,cla);
|
if(bundle!=null){
|
hashMap.put(ActionEvent.ParameterField.BUNDLE,bundle);
|
}
|
updateAction(new ActionEventData(ActionEvent.Action.START_ACTIVITY,hashMap),false);
|
}
|
|
public void startActivity(Class<?> cla){
|
HashMap<String,Object> hashMap=new HashMap<>();
|
hashMap.put(ActionEvent.ParameterField.CLASS,cla);
|
updateAction(new ActionEventData(ActionEvent.Action.START_ACTIVITY,hashMap),false);
|
}
|
|
/**
|
* 暴露给观察者提供加载事件,{@link BaseActivity} 或 {@link BaseFragment} 已默认注册加载事件,
|
* 只需调用{@link #showLoading()} 或 {@link #hideLoading()}即可在{@link BaseActivity}
|
* 或 {@link BaseFragment} 中收到订阅事件
|
* @return {@link #mLoadingEvent}
|
*/
|
public SingleLiveEvent<Boolean> getLoadingEvent(){
|
return mLoadingEvent;
|
}
|
|
/**
|
* 暴露给观察者提供消息事件,通过注册{@link BaseActivity#registerMessageEvent(MessageEvent.MessageObserver)}或
|
* {@link BaseFragment#registerMessageEvent(MessageEvent.MessageObserver)} 或
|
* {@link BaseDialogFragment#registerMessageEvent(MessageEvent.MessageObserver)}接收消息事件
|
* @return {@link #mMessageEvent}
|
*/
|
public MessageEvent getMessageEvent(){
|
return mMessageEvent;
|
}
|
|
/**
|
* 暴露给观察者提供状态变化事件,通过注册{@link BaseActivity#registerStatusEvent(StatusEvent.StatusObserver)}或
|
* {@link BaseFragment#registerStatusEvent(StatusEvent.StatusObserver)} 或
|
* {@link BaseDialogFragment#registerStatusEvent(StatusEvent.StatusObserver)}接收消息事件
|
* @return {@link #mStatusEvent}
|
*/
|
public StatusEvent getStatusEvent(){
|
return mStatusEvent;
|
}
|
|
/**
|
* 暴露给观察者提供接收单个消息事件,通过注册{@link BaseActivity#registerSingleLiveEvent(Observer)}或
|
* {@link BaseFragment#registerSingleLiveEvent(Observer)} 或
|
* {@link BaseDialogFragment#registerSingleLiveEvent(Observer)}接收消息事件
|
* @return {@link #mSingleLiveEvent}
|
*/
|
public SingleLiveEvent<Message> getSingleLiveEvent(){
|
return mSingleLiveEvent;
|
}
|
|
/**
|
* 发送消息,通过注册{@link BaseActivity#registerMessageEvent(MessageEvent.MessageObserver)}或
|
* {@link BaseFragment#registerMessageEvent(MessageEvent.MessageObserver)} 或
|
* {@link BaseDialogFragment#registerMessageEvent(MessageEvent.MessageObserver)}接收消息事件,
|
* 也可通过观察{@link #getMessageEvent()}接收消息事件
|
* @param msgId 资源文件id
|
*/
|
@MainThread
|
public void sendMessage(@StringRes int msgId) {
|
sendMessage(msgId,false);
|
}
|
|
/**
|
* 发送消息,通过注册{@link BaseActivity#registerMessageEvent(MessageEvent.MessageObserver)}或
|
* {@link BaseFragment#registerMessageEvent(MessageEvent.MessageObserver)} 或
|
* {@link BaseDialogFragment#registerMessageEvent(MessageEvent.MessageObserver)}接收消息事件,
|
* 也可通过观察{@link #getMessageEvent()}接收消息事件
|
* @param msgId 资源文件id
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void sendMessage(@StringRes int msgId, boolean post) {
|
sendMessage(getApplication().getString(msgId),post);
|
}
|
|
/**
|
* 发送消息,通过注册{@link BaseActivity#registerMessageEvent(MessageEvent.MessageObserver)}或
|
* {@link BaseFragment#registerMessageEvent(MessageEvent.MessageObserver)} 或
|
* {@link BaseDialogFragment#registerMessageEvent(MessageEvent.MessageObserver)}接收消息事件,
|
* 也可通过观察{@link #getMessageEvent()}接收消息事件
|
* @param message 消息内容
|
*/
|
@MainThread
|
public void sendMessage(String message){
|
mMessageEvent.setValue(message);
|
}
|
|
/**
|
* 发送消息,通过注册{@link BaseActivity#registerMessageEvent(MessageEvent.MessageObserver)}或
|
* {@link BaseFragment#registerMessageEvent(MessageEvent.MessageObserver)} 或
|
* {@link BaseDialogFragment#registerMessageEvent(MessageEvent.MessageObserver)}接收消息事件,
|
* 也可通过观察{@link #getMessageEvent()}接收消息事件
|
* @param message 消息内容
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void sendMessage(String message, boolean post){
|
if(post){
|
mMessageEvent.postValue(message);
|
}else{
|
mMessageEvent.setValue(message);
|
}
|
}
|
|
|
/**
|
* 更新状态,通过注册{@link BaseActivity#registerStatusEvent(StatusEvent.StatusObserver)}或
|
* {@link BaseFragment#registerStatusEvent(StatusEvent.StatusObserver)} 或
|
* {@link BaseDialogFragment#registerStatusEvent(StatusEvent.StatusObserver)}接收消息事件,
|
* 也可通过观察{@link #getStatusEvent()}接收消息事件
|
* @param status
|
*/
|
@MainThread
|
public void updateStatus(@StatusEvent.Status int status){
|
updateStatus(status,false);
|
}
|
|
/**
|
* 更新状态,通过注册{@link BaseActivity#registerStatusEvent(StatusEvent.StatusObserver)}或
|
* {@link BaseFragment#registerStatusEvent(StatusEvent.StatusObserver)} 或
|
* {@link BaseDialogFragment#registerStatusEvent(StatusEvent.StatusObserver)}接收消息事件,
|
* 也可通过观察{@link #getStatusEvent()}接收消息事件
|
* @param status
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void updateStatus(@StatusEvent.Status int status, boolean post){
|
if(post){
|
mStatusEvent.postValue(status);
|
}else{
|
mStatusEvent.setValue(status);
|
}
|
}
|
|
/**
|
* 发送单个消息事件,消息为{@link Message}对象,可通过{@link Message#what}区分消息类型,用法与{@link Message}一致,
|
* 通过注册{@link BaseActivity#registerSingleLiveEvent(Observer)}或
|
* {@link BaseFragment#registerSingleLiveEvent(Observer)} 或
|
* {@link BaseDialogFragment#registerSingleLiveEvent(Observer)}接收消息事件,
|
* 也可通过观察{@link #getSingleLiveEvent()}接收消息事件
|
* @param what
|
*/
|
@MainThread
|
public void sendSingleLiveEvent(int what){
|
sendSingleLiveEvent(what,false);
|
}
|
|
/**
|
* 发送单个消息事件,消息为{@link Message}对象,可通过{@link Message#what}区分消息类型,用法与{@link Message}一致,
|
* 通过注册{@link BaseActivity#registerSingleLiveEvent(Observer)}或
|
* {@link BaseFragment#registerSingleLiveEvent(Observer)} 或
|
* {@link BaseDialogFragment#registerSingleLiveEvent(Observer)}接收消息事件,
|
* 也可通过观察{@link #getSingleLiveEvent()}接收消息事件
|
* @param what
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void sendSingleLiveEvent(int what, boolean post){
|
Message message = Message.obtain();
|
message.what = what;
|
sendSingleLiveEvent(message,post);
|
}
|
|
/**
|
* 发送单个消息事件,消息为{@link Message}对象,可通过{@link Message#what}区分消息类型,用法与{@link Message}一致,
|
* 通过注册{@link BaseActivity#registerSingleLiveEvent(Observer)}或
|
* {@link BaseFragment#registerSingleLiveEvent(Observer)} 或
|
* {@link BaseDialogFragment#registerSingleLiveEvent(Observer)}接收消息事件,
|
* 也可通过观察{@link #getSingleLiveEvent()}接收消息事件
|
* @param message
|
*/
|
@MainThread
|
public void sendSingleLiveEvent(Message message){
|
sendSingleLiveEvent(message,false);
|
}
|
|
/**
|
* 发送单个消息事件,消息为{@link Message}对象,可通过{@link Message#what}区分消息类型,用法与{@link Message}一致,
|
* 通过注册{@link BaseActivity#registerSingleLiveEvent(Observer)}或
|
* {@link BaseFragment#registerSingleLiveEvent(Observer)} 或
|
* {@link BaseDialogFragment#registerSingleLiveEvent(Observer)}接收消息事件,
|
* 也可通过观察{@link #getSingleLiveEvent()}接收消息事件
|
* @param message
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void sendSingleLiveEvent(Message message, boolean post){
|
if(post){
|
mSingleLiveEvent.postValue(message);
|
}else{
|
mSingleLiveEvent.setValue(message);
|
}
|
}
|
|
/**
|
* 调用此类会同步通知执行{@link BaseActivity#showLoading()}或{@link BaseFragment#showLoading()}或
|
* {@link BaseDialogFragment#showLoading()}
|
*/
|
@MainThread
|
public void showLoading() {
|
showLoading(true);
|
}
|
|
/**
|
* 调用此类会同步通知执行{@link BaseActivity#showLoading()}或{@link BaseFragment#showLoading()}或
|
* {@link BaseDialogFragment#showLoading()}
|
*/
|
public void showLoading(boolean post) {
|
if(post){
|
mLoadingEvent.postValue(true);
|
}else{
|
mLoadingEvent.setValue(true);
|
}
|
}
|
|
/**
|
* 调用此类会同步通知执行{@link BaseActivity#hideLoading()}或{@link BaseFragment#hideLoading()}或
|
* {@link BaseDialogFragment#hideLoading()}
|
*/
|
@MainThread
|
public void hideLoading() {
|
hideLoading(false);
|
}
|
|
|
/**
|
* 调用此类会同步通知执行{@link BaseActivity#hideLoading()}或{@link BaseFragment#hideLoading()}或
|
* {@link BaseDialogFragment#hideLoading()}
|
* @param post 如果为{@code true}则可以在子线程调用,相当于调用{@link MutableLiveData#postValue(Object)},
|
* 如果为{@code false} 相当于调用{@link MutableLiveData#setValue(Object)}
|
*/
|
public void hideLoading(boolean post) {
|
if(post){
|
mLoadingEvent.postValue(false);
|
}else{
|
mLoadingEvent.setValue(false);
|
}
|
}
|
|
|
}
|