| 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 void doAction(int type,String obj){ | 
|         actionEvent.setValue(new ActionEventData(type,obj)); | 
|     } | 
|   | 
|     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); | 
|         } | 
|     } | 
|   | 
|   | 
| } |