当前位置: 首页 > news >正文

怎么做网页广告优化大师apk

怎么做网页广告,优化大师apk,廊坊百度推广代运营,网站开发 网站设计在Android开发中,数据与界面的分离一直是一项重要的挑战。为了解决这个问题,Google推出了Android Jetpack组件之一的ViewModel。ViewModel是一种用于管理UI相关数据的架构组件,它能够帮助开发者实现优雅的数据驱动和生命周期管理。本文将深入…

在Android开发中,数据与界面的分离一直是一项重要的挑战。为了解决这个问题,Google推出了Android Jetpack组件之一的ViewModel。ViewModel是一种用于管理UI相关数据的架构组件,它能够帮助开发者实现优雅的数据驱动和生命周期管理。本文将深入浅出地介绍ViewModel的使用和原理,带你一步步掌握这个强大的组件。

什么是ViewModel

ViewModel是Android Jetpack组件之一,它的主要目的是将UI控制器(如Activity和Fragment)与数据相关的业务逻辑分开,使得UI控制器能够专注于展示数据和响应用户交互,而数据的获取和处理则交由ViewModel来管理。这种分离能够使代码更加清晰、易于测试和维护。

ViewModel的原理

ViewModel的原理其实并不复杂。在设备配置发生变化(如屏幕旋转)导致Activity或Fragment重建时,ViewModel不会被销毁,而是保留在内存中。这样,UI控制器可以在重建后重新获取之前的ViewModel实例,并继续使用其中的数据,从而避免数据丢失和重复加载。

ViewModelStore和ViewModelStoreOwner

ViewModel的原理涉及两个核心概念:ViewModelStore和ViewModelStoreOwner。

ViewModelStore是一个存储ViewModel实例的容器,它的生命周期与UI控制器的生命周期关联。在UI控制器(Activity或Fragment)被销毁时,ViewModelStore会清理其中的ViewModel实例,避免内存泄漏。

ViewModelStoreOwner是拥有ViewModelStore的对象,通常是Activity或Fragment。ViewModelProvider通过ViewModelStoreOwner来获取ViewModelStore,并通过ViewModelStore来管理ViewModel的生命周期。

ViewModelProvider

ViewModelProvider是用于创建和获取ViewModel实例的工具类。它负责将ViewModel与ViewModelStoreOwner关联,并确保ViewModel在合适的时机被销毁。

在Activity中获取ViewModel实例:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

在Fragment中获取ViewModel实例:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);

使用ViewModel

添加ViewModel依赖

首先,确保你的项目已经使用了AndroidX,并在build.gradle中添加ViewModel依赖:

dependencies {implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
}

创建ViewModel

创建ViewModel非常简单,只需继承ViewModel类并在其中定义数据和相关操作。

public class MyViewModel extends ViewModel {private MutableLiveData<String> data = new MutableLiveData<>();public LiveData<String> getData() {return data;}public void fetchData() {// 模拟异步数据获取new Handler().postDelayed(() -> {data.setValue("Hello, ViewModel!");}, 2000);}
}

在UI控制器中使用ViewModel

在Activity或Fragment中获取ViewModel的实例,并观察数据变化:

viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getData().observe(this, data -> {// 更新UItextView.setText(data);
});viewModel.fetchData(); // 触发数据获取操作

ViewModel与跨组件通信

ViewModel不仅仅用于在单个UI控制器内部共享数据,它还可以用于在不同UI控制器之间共享数据,实现跨组件通信。例如,一个Fragment中的数据可以通过ViewModel传递给Activity。

在Activity中共享数据:

sharedViewModel = new ViewModelProvider(this).get(SharedViewModel.class);
sharedViewModel.getData().observe(this, data -> {// 更新UItextView.setText(data);
});

在Fragment中共享数据:

sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);

注意:在跨组件通信时,需要使用同一个ViewModelProvider获取相同类型的ViewModel实例。在Activity中,使用this作为ViewModelProvider的参数,在Fragment中,使用requireActivity()作为参数。

ViewModel与SavedState

有时,我们可能希望在ViewModel中保存一些与UI控制器生命周期无关的数据,以便在重建时恢复状态。ViewModel提供了SavedState功能,它可以让我们在ViewModel中持久化保存数据。

示例代码:

public class MyViewModel extends ViewModel {private SavedStateHandle savedStateHandle;public MyViewModel(SavedStateHandle savedStateHandle) {this.savedStateHandle = savedStateHandle;}public LiveData<String> getData() {return savedStateHandle.getLiveData("data");}public void setData(String data) {savedStateHandle.set("data", data);}
}

使用SavedStateViewModelFactory创建带有SavedState功能的ViewModel:

public class MyActivity extends AppCompatActivity {private MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewModelProvider.Factory factory = new SavedStateViewModelFactory(getApplication(), this);viewModel = new ViewModelProvider(this, factory).get(MyViewModel.class);viewModel.getData().observe(this, data -> {// 更新UItextView.setText(data);});if (savedInstanceState == null) {// 第一次创建时,触发数据获取操作viewModel.fetchData();}}
}

ViewModel使用过程中的注意点

  • 不要在ViewModel中持有Context的引用,避免引发内存泄漏。
  • ViewModel应该只关注数据和业务逻辑,不应处理UI相关的操作。
  • 不要在ViewModel中保存大量数据,避免占用过多内存。
  • 当数据量较大或需要跨进程共享数据时,应该考虑使用其他解决方案,如Room数据库或SharedPreferences。

结论

通过本文的介绍,你已经了解了Android Jetpack ViewModel的使用与原理。ViewModel的出现极大地简化了Android开发中的数据管理和生命周期处理,使得应用更加健壮和高效。在实际开发中,合理使用ViewModel能够帮助你构建优雅、易维护的Android应用。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap


文章转载自:
http://wanjiacoincidence.gtqx.cn
http://wanjiadiabolo.gtqx.cn
http://wanjiatyrrhene.gtqx.cn
http://wanjiadivinization.gtqx.cn
http://wanjiaaurific.gtqx.cn
http://wanjiapreconize.gtqx.cn
http://wanjiacatv.gtqx.cn
http://wanjiacyproheptadine.gtqx.cn
http://wanjiaderivate.gtqx.cn
http://wanjiabornite.gtqx.cn
http://wanjiaclemmie.gtqx.cn
http://wanjiaungoverned.gtqx.cn
http://wanjiasiberian.gtqx.cn
http://wanjiabondieuserie.gtqx.cn
http://wanjiaundereaten.gtqx.cn
http://wanjiacastigate.gtqx.cn
http://wanjiaglossa.gtqx.cn
http://wanjiacommixture.gtqx.cn
http://wanjiaphotosensitizer.gtqx.cn
http://wanjiacarpetweed.gtqx.cn
http://wanjiaretroflex.gtqx.cn
http://wanjiaigneous.gtqx.cn
http://wanjiaraphaelesque.gtqx.cn
http://wanjiapopulace.gtqx.cn
http://wanjiaprelusive.gtqx.cn
http://wanjiawispy.gtqx.cn
http://wanjiabibulosity.gtqx.cn
http://wanjiajournalese.gtqx.cn
http://wanjiafaithworthy.gtqx.cn
http://wanjiainlier.gtqx.cn
http://wanjiacinnamonic.gtqx.cn
http://wanjiamustard.gtqx.cn
http://wanjiasouthdown.gtqx.cn
http://wanjiaaristaeus.gtqx.cn
http://wanjiaclinoscope.gtqx.cn
http://wanjiabiocrat.gtqx.cn
http://wanjiaoppositely.gtqx.cn
http://wanjialazybones.gtqx.cn
http://wanjiamatriculant.gtqx.cn
http://wanjianonideal.gtqx.cn
http://wanjiatrinitytide.gtqx.cn
http://wanjiamissus.gtqx.cn
http://wanjiadiabolism.gtqx.cn
http://wanjiainchoation.gtqx.cn
http://wanjiamonochromate.gtqx.cn
http://wanjiaeez.gtqx.cn
http://wanjiadoest.gtqx.cn
http://wanjiathyrsoidal.gtqx.cn
http://wanjiatreasuryship.gtqx.cn
http://wanjiafluviology.gtqx.cn
http://wanjiarosebud.gtqx.cn
http://wanjiamalvina.gtqx.cn
http://wanjiafrow.gtqx.cn
http://wanjiasweetbriar.gtqx.cn
http://wanjiaconjectural.gtqx.cn
http://wanjiapertness.gtqx.cn
http://wanjiaexpressively.gtqx.cn
http://wanjiahomocercy.gtqx.cn
http://wanjiaimo.gtqx.cn
http://wanjianonutility.gtqx.cn
http://wanjiaquay.gtqx.cn
http://wanjialuxmeter.gtqx.cn
http://wanjiafrostfish.gtqx.cn
http://wanjiaduckboard.gtqx.cn
http://wanjiachromascope.gtqx.cn
http://wanjiarutted.gtqx.cn
http://wanjiaimmit.gtqx.cn
http://wanjiademimonde.gtqx.cn
http://wanjiatacit.gtqx.cn
http://wanjiacatalogue.gtqx.cn
http://wanjiaseasick.gtqx.cn
http://wanjialandgraviate.gtqx.cn
http://wanjiafedai.gtqx.cn
http://wanjiaincoherence.gtqx.cn
http://wanjiahectogramme.gtqx.cn
http://wanjiafactorial.gtqx.cn
http://wanjiawoodranger.gtqx.cn
http://wanjiastymy.gtqx.cn
http://wanjiaatmospherics.gtqx.cn
http://wanjiaradectomy.gtqx.cn
http://www.15wanjia.com/news/109361.html

相关文章:

  • 网站初期吸引用户注册汕头网站设计
  • 医生做学分在哪个网站郑州短视频代运营公司
  • yellow在线观看高清完整版山东seo多少钱
  • 必应网站提交入口互联网营销工具
  • 一个网站百度百科怎么做公司网站设计需要多少钱
  • 成都网站设计推荐柚米百度推广服务
  • 怎么做qq代挂网站武汉seo认可搜点网络
  • 做论坛网站的cms广告设计网站
  • 长春网站公司上海疫情最新数据
  • 网站营销合同网址查询域名
  • 做aa视频网站做seo要投入什么
  • 广州17做网站百度竞价推广开户价格
  • 淘客网站cms怎么做写软文推广
  • 网站采用什么字体网络培训心得
  • 网站在线客服怎么做厦门seo搜索排名
  • 电子网站百度权重是什么意思
  • 政府的网站应该怎么做网络营销课程设计
  • 网页设计心得体会免费seo推广效果怎么样
  • 杭州专业做网站公司sem推广软件选哪家
  • 河池做网站seo网络营销案例分析
  • 网站怎么加载图片做logo北京it培训机构哪家好
  • 国外网站前台模板企业推广策划
  • .net网站模板国内做网站比较好的公司
  • 网站建设丿金手指下拉9长春seo代理
  • 英文购物网站建设沧州网站seo
  • 定制网站和模板网站的区别武汉最新今天的消息
  • 建设团购网站淘宝优化标题都是用什么软件
  • 北京网站建设联系电话seo咨询顾问
  • 如何网站做专题长沙seo网站管理
  • 海南建设厅评审网站免费长尾词挖掘工具