日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android ViewModel+liveData+lifecycle+databinding打造MVVM

發(fā)布時(shí)間:2025/3/18 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android ViewModel+liveData+lifecycle+databinding打造MVVM 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Google JetPack

最近google推出JetPack官方架構(gòu)組件,最近有時(shí)間在網(wǎng)上看了很多類(lèi)似的文章,對(duì)ViewModel和lifeCycle有了大概的了解,谷歌意在使用這些組件完成代碼解耦,實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)UI的模式,但是還沒(méi)有深入的了解,效率優(yōu)先,還是動(dòng)手才能看到這些架構(gòu)組件具體是怎樣的使用,來(lái)實(shí)現(xiàn)簡(jiǎn)單的MVVM模式。 每個(gè)組件的單獨(dú)使用網(wǎng)上有很多文章,大家可以自行去查看,我也是拿來(lái)主義,直接上代碼。

MVVM設(shè)計(jì)模式:

網(wǎng)絡(luò)請(qǐng)求:

接口使用的網(wǎng)上一位大神測(cè)試用的接口,UI也是直接使用,本人較懶,請(qǐng)求使用流行的Retrofit2+rxjava2,將其封裝在BaseModel中:

public class BaseModel {public BaseModel() {}public void getImage(String format, int idx, int n, BaseObserver<ImageBean> observer) {ApiRepertory.getInstance().getService().getImage(format, idx, n).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);} }復(fù)制代碼

lifeCycle綁定頁(yè)面生命周期

此處的Presenter用于將ViewModel中的業(yè)務(wù)綁定到不同的生命周期中去執(zhí)行業(yè)務(wù)邏輯。

public abstract class BaseLifeCycle<P extends BasePresenter> implements ILifeCycle {protected Context mContext;protected P mPresenter;public BaseLifeCycle(Context context) {this.mContext = context;}protected void addPresenter(P mPresenter) {if (mPresenter != null) {this.mPresenter = mPresenter;}}@Overridepublic void onCreate(@Nullable LifecycleOwner owner) {}@Overridepublic void onDestroy(@Nullable LifecycleOwner owner) {}@Overridepublic void onStart(@Nullable LifecycleOwner owner) {}@Overridepublic void onResume(@Nullable LifecycleOwner owner) {}@Overridepublic void onPause(@Nullable LifecycleOwner owner) {}@Overridepublic void onStop(@Nullable LifecycleOwner owner) {}@Overridepublic void onLifecycleChanged(@Nullable LifecycleOwner owner, @Nullable Lifecycle.Event event) {} }復(fù)制代碼

這里ILifeCycle接口用來(lái)繼承LifecycleObserver,SupportActivity內(nèi)部已經(jīng)實(shí)現(xiàn)了LifecycleOwner接口用來(lái)獲取lifeCycle,加入LifecycleObserver來(lái)添加觀察者來(lái)響應(yīng)不同的生命周期。

public interface ILifeCycle extends LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)void onCreate(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)void onDestroy(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_START)void onStart(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)void onResume(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)void onPause(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_STOP)void onStop(@Nullable LifecycleOwner owner);@OnLifecycleEvent(Lifecycle.Event.ON_ANY)void onLifecycleChanged(@Nullable LifecycleOwner owner,@Nullable Lifecycle.Event event); } 復(fù)制代碼

還有此處的BasePresenter用來(lái)綁定ViewModel,實(shí)現(xiàn)其中的業(yè)務(wù)邏輯。

public abstract class BasePresenter<M extends ViewModel> {protected M mViewModel;public BasePresenter(M viewModel) {if (viewModel != null) {this.mViewModel = viewModel;}} } 復(fù)制代碼

下面是將lifeCycle和databinding寫(xiě)入BaseActivity中比較簡(jiǎn)單,沒(méi)有集成過(guò)多的其他組件。 getLifecycle().addObserver(mLifeCycle);將不同頁(yè)面的生命周期邏輯綁定到不同頁(yè)面中, mLifeCycle.addPresenter(mPresenter);將業(yè)務(wù)處理部分加入到生面周期中,用于在不同的生命周期中處理不同的業(yè)務(wù)。 startListenerData();此處用于實(shí)現(xiàn)ViewModel數(shù)據(jù)返回View進(jìn)行響應(yīng)刷新的邏輯。

public abstract class BaseActivity<L extends BaseLifeCycle, V extends ViewDataBinding, P extends BasePresenter>extends AppCompatActivity{protected Context mContext;protected L mLifeCycle;protected V dataBinding;protected P mPresenter;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = this;dataBinding = DataBindingUtil.setContentView(this, getLayoutRes());initView();getLifecycle().addObserver(mLifeCycle);mLifeCycle.addPresenter(mPresenter);startListenerData();}protected abstract void startListenerData();protected abstract void initView();protected abstract int getLayoutRes(); } 復(fù)制代碼

下面看下在Activity中的具體實(shí)現(xiàn): ImageViewModel中就是具體的業(yè)務(wù)邏輯的實(shí)現(xiàn)與數(shù)據(jù)的綁定; MainLifeCycle是該頁(yè)面的生命周期,presenter在不同的生命周期實(shí)現(xiàn)不同的處理。

public class MainActivity extends BaseActivity<MainLifeCycle, ActivityMainBinding, ImagePresenter> {private ProgressDialog mProgressDialog;private ImageViewModel baseViewModel;@Overrideprotected void initView() {mLifeCycle = new MainLifeCycle(this);mProgressDialog = new ProgressDialog(this);mProgressDialog.setMessage("加載中");baseViewModel = ViewModelProviders.of(this).get(ImageViewModel.class);dataBinding.setClick(new ClickHandler());//將presener綁定生命周期mPresenter = new ImagePresenter(baseViewModel);mProgressDialog.show();}@Overrideprotected int getLayoutRes() {return R.layout.activity_main;}@Overrideprotected void startListenerData() {baseViewModel.getMutableLiveData().observe(this, new Observer<Data<ImageBean.ImagesBean>>() {@Overridepublic void onChanged(@Nullable Data<ImageBean.ImagesBean> imagesBeanData) {if (imagesBeanData.getErrorMsg() != null) {Toast.makeText(mContext, imagesBeanData.getErrorMsg(), Toast.LENGTH_SHORT).show();mProgressDialog.dismiss();return;}dataBinding.setImageBean(imagesBeanData.getData());setTitle(imagesBeanData.getData().getCopyright());mProgressDialog.dismiss();}});}public class MainLifeCycle extends BaseLifeCycle<ImagePresenter> {public MainLifeCycle(Context context) {super(context);}@Overridepublic void onStart(@Nullable LifecycleOwner owner) {Log.e("MainActivity", "onCreate");mPresenter.loadImage();} } 復(fù)制代碼

好了,簡(jiǎn)單的mvvm模式大概就是這樣,本人能力有限,有很多不足之處,如有大神請(qǐng)指摘,下面貼出代碼的GitHub地址:github.com/ale0201/mvv…

總結(jié)

以上是生活随笔為你收集整理的Android ViewModel+liveData+lifecycle+databinding打造MVVM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。