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

网站建设方案 前台 后台WordPress引用阿里云矢量图

网站建设方案 前台 后台,WordPress引用阿里云矢量图,澧县网页定制,威联通 wordpress引言 Jetpack是一个开发组件工具集#xff0c;它的主要目的是帮助我们编写出更加简洁的代码#xff0c;并简化我们的开发过程#xff0c;在这么多的组件当中#xff0c;最需要我们关注的其实还是架构组件#xff0c;接下来就对Jetpack的主要架构组件进行学习#xff01;…引言 Jetpack是一个开发组件工具集它的主要目的是帮助我们编写出更加简洁的代码并简化我们的开发过程在这么多的组件当中最需要我们关注的其实还是架构组件接下来就对Jetpack的主要架构组件进行学习 ViewModel ViewModel的诞生 瞬时数据的丢失在之前应该已经写过一些程序了当我们开启屏幕旋转的时候会发现之间的数据丢失这是因为在屏幕旋转的时候相当于新创建了一个当前活动异步调用时的内存泄漏UI 控制器Activity 或 Fragment有自己的生命周期它们可能会在不需要时被销毁例如用户按下 Home 键或者屏幕旋转。然而异步任务一旦开始通常会在后台线程中运行直到任务完成不管 UI 控制器的状态如何如果在异步任务中持有 UI 控制器的强引用如直接引用 Activity那么即使 UI 控制器已经被销毁这个引用仍然存在。这意味着垃圾回收器GC不能回收 UI 控制器的实例因为它仍然被异步任务引用从而导致内存泄漏类膨胀提高维护难度和测试难度类似于活动当中的代码量过多 ViewModel的作用 它是介于View视图和Model数据模型之间的桥梁使数据和视图能够分离也能保持通信 实践 新建一个活动放置一个TextView和一个按钮当每次按下这个按钮就会使TextView部分的数字加一这个逻辑大家想必都能很快的写出来找到按钮与文本控件为按钮注册点击事件每次使用getText()与setText()方法修改文本部分的内容但当我们的屏幕进行旋转的时候数据就会丢失变为0因此使用ViewModel来解决这个问题我们为按钮注册点击事件创建一个MyViewModel继承于ViewModel将文本内容的数字设置在这里 public class MyViewModel extends ViewModel {public int number; }主活动的代码 public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {......textView findViewById(R.id.Textview);viewModel new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.number));}//为按钮注册的点击事件public void plus(View view) {textView.setText(String.valueOf(viewModel.number));} }大部分的代码之间经常看到分析一下中间的代码 ViewModelProvider是Android架构组件库中的一个类用于获取ViewModel实例。this参数传递的是当前的Activity实例。new ViewModelProvider.AndroidViewModelFactory(getApplication())创建了一个AndroidViewModelFactory实例它是一个工厂类用于创建AndroidViewModel类型的ViewModel实例。getApplication()方法用于获取当前应用程序的上下文。.get(MyViewModel.class)调用ViewModelProvider的get方法传入MyViewModel.class作为参数以获取MyViewModel的实例。 此时无论我们如何旋转屏幕数据都不会丢失 ViewModel的生命周期 ViewModel 的生命周期比 Activity 或 Fragment 的生命周期更长它不会因为配置更改如屏幕旋转而重建。 ViewModel 的生命周期 创建 (onCreate): 当 ViewModel 首次被请求时它会被创建。这通常发生在 Activity 或 Fragment 的 onCreate 或 onCreateView 方法中通过 ViewModelProvider 获取 ViewModel 实例时。准备 (onCleared): ViewModel 提供了一个 onCleared() 方法这是一个生命周期回调当 ViewModel 被清除并且即将销毁时会被调用。你可以在这个回调中执行清理工作比如取消网络请求、注销观察者等。活跃: 在 ViewModel 被创建后它会保持活跃状态直到与它关联的 Activity 或 Fragment 被销毁。即使 Activity 因为配置更改如屏幕旋转而重建ViewModel 也不会被销毁它会保持原有的状态。销毁 (onCleared): 当 Activity 或 Fragment 被销毁并且没有任何其他组件与 ViewModel 关联时ViewModel 会被销毁。onCleared() 方法会在销毁时被调用。 ViewModel 与 Activity/Fragment 生命周期的关系 Activity/Fragment 创建: 当 Activity 或 Fragment 创建时你可以通过 ViewModelProvider 获取 ViewModel 实例。如果 ViewModel 已经存在比如在屏幕旋转后重建 Activity 时则直接使用现有的实例。Activity/Fragment 重建: 如果 Activity 因为配置更改而重建ViewModel 会保持不变这意味着 ViewModel 中的数据不会丢失。Activity/Fragment 销毁: 当 Activity 或 Fragment 被销毁时ViewModel 不会被销毁除非没有任何 Activity 或 Fragment 与它关联。ViewModel 销毁: 当最后一个与 ViewModel 相关联的 Activity 或 Fragment 被销毁并且 ViewModel 没有被其他组件引用时它会被销毁。 LiveData 和ViewModel之间的关系 当ViewModel中的数据发生变化的时候LiveData告诉View 使用 简单应用 在活动当中设置一个TextView来显示数据同样的我们创建一个MyViewModel来防止数据的丢失 public class MyViewModel extends ViewModel {private MutableLiveDataInteger current;public MutableLiveDataInteger getCurrent() {if (current null) {current new MutableLiveData();current.setValue(0);}return current;} }public class MainActivity extends AppCompatActivity {TextView textView;MyViewModel viewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {......textView findViewById(R.id.text);viewModel new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.getCurrent().getValue()));viewModel.getCurrent().observe(this, new ObserverInteger() {Overridepublic void onChanged(Integer i) {textView.setText(String.valueOf(i));}});startTimer();}private void startTimer() {new Timer().schedule(new TimerTask() {Overridepublic void run() {//非UI线程postValue()//UI线程setValue()viewModel.getCurrent().postValue(viewModel.getCurrent().getValue() 1);}}, 1000, 1000);} }此时运行程序屏幕上的数字就在隔一秒加一。 ViewModel与LiveData实现Fragment之间的数据传递 我们创建一个活动在这个活动当中放置两个碎片碎片当中放置各自放置一个滑动条此时活动的布局如下 当我们拖动碎片当中的一条滑动条另一个是不动的因为我们没有将两个碎片联系起来若我们想将两个滑动条进行关联使滑动一条滑动条另一个也跟着动就会想到通过Fragment之间的数据传递部分进行联系就会使主活动的代码量非常大并且 Fragment 之间高度耦合这使得代码难以维护和扩展。此时我们就可以使用 ViewModel LiveData去实现。 新建一个MyViewModel继承于ViewModel public class MyViewModel extends ViewModel {private MutableLiveDataInteger progress;public MutableLiveDataInteger getProgress() {if (progress null) {progress.setValue(0);}return progress;} }对Fragment部分代码进行修改另一个碎片的代码也是一样的 Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View root inflater.inflate(R.layout.fragment_blank, container, false);SeekBar seekBar root.findViewById(R.id.progress_bar1);MyViewModel myViewModel new ViewModelProvider(getActivity(), new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(MyViewModel.class);//第一处myViewModel.getProgress().observe(getActivity(), new ObserverInteger() {Overridepublic void onChanged(Integer i) {seekBar.setProgress(i);}});//第二处seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {//第三处Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {myViewModel.getProgress().setValue(progress);}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {//当用户开始触摸 SeekBar 时这个方法会被调用}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//当用户停止触摸 SeekBar 时这个方法会被调用}});return root; }第一处这行代码注册了一个观察者Observer来监听 myViewModel.getProgress() LiveData 中的数据变化。当 LiveData 中的值发生变化时onChanged(Integer i) 方法会被调用并且新的进度值 i 会被传递到这个方法中。第二处为 SeekBar 设置了一个监听器用于监听用户与 SeekBar 的交互如拖动进度条当进度条发生变化的时候就会执行里面的方法第三处当用户拖动 SeekBar 或 SeekBar 的进度发生变化时这个方法会被调用progress 参数表示 SeekBar 当前的进度值。fromUser 参数是一个布尔值表示进度变化是否由用户操作引起如果是程序调用 setProgress 则为 false。 我们并没有对主活动进行任何的代码添加与修改接下来运行程序当我们无论滑动哪一个碎片里的进度条另一个也会跟着滑动。 LiveData的优势 生命周期感知 LiveData 遵循观察者的生命周期。它确保在观察者如 Activity 或 Fragment处于活跃状态时才发送数据更新从而避免在组件已经销毁后更新 UI 导致的内存泄漏。避免内存泄漏 由于 LiveData 与观察者的生命周期绑定它不会向已经销毁的观察者发送更新这减少了因 UI 控制器生命周期管理不当而导致的内存泄漏风险。数据变化的响应式更新 当数据发生变化时LiveData 会自动通知活跃的观察者。这种响应式编程模式使得 UI 能够自动响应数据的变化而无需手动轮询数据。可观察的数据存储 LiveData 可以存储数据的最新状态当观察者开始观察 LiveData 时它会立即接收到当前的数据状态确保 UI 显示的数据是最新的。支持转换操作 LiveData 可以与 Transformations 和 MediatorLiveData 等工具结合使用支持复杂的数据转换和组合操作使得数据的处理更加灵活和强大。线程安全 LiveData 的更新操作是线程安全的你可以在后台线程中更新 LiveData 的数据而无需担心线程同步问题。简化数据共享 LiveData 可以简化不同组件间的数据共享特别是当多个组件需要观察同一份数据时LiveData 提供了一种简洁的观察和更新机制。易于测试 由于 LiveData 的数据更新是可观察的你可以更容易地编写测试用例来验证数据更新是否按预期触发了 UI 的变化。减少 boilerplate 代码 LiveData 减少了在 Activity 或 Fragment 中处理数据更新和 UI 响应的样板代码使得代码更加简洁和易于维护。支持数据恢复 在配置更改如屏幕旋转后LiveData 可以帮助恢复数据状态因为它保持了数据的最新值直到观察者重新观察它。 DataBinding 意义让布局文件承担了部分原本属于页面的工作使页面与布局耦合度进一步降低 应用 基本应用 根据一个例子来理解吧 新建一个活动活动当中放置一个图片和两个TextView控件我们之前为TextView设置内容都是在主活动当中先获取到控件在使用setText()方法设置现在我们试试不在活动当中此时的布局文件大家都会写在这里就不展示了打开build.gradle文件添加以下内容注意不要忘记sync now 鼠标位于布局文件的最前端点击alt回车就会出现以下内容我们需要添加红色边框部分内容 data这个元素定义了布局文件中可以使用的数据源。variable这个元素定义了一个变量它可以在布局文件中被引用。 nameidol这是变量的名称在布局文件中可以通过这个名称来引用变量。typecom.example.databinding.Idol这是变量的类型它指定了变量的数据类型。在这个例子中Idol是一个Java类它可能定义了一些属性名字、等级这些属性可以在布局文件中被绑定到UI组件上。 对主活动进行修改 ActivityMainBinding activityMainBinding DataBindingUtil.setContentView(this, R.layout.activity_main); Idol idol new Idol(熊大, 五星); activityMainBinding.setIdol(idol);activityMainBinding这是一个变量它存储了绑定类的实例可以通过这个变量访问布局文件中定义的视图和变量。DataBindingUtil.setContentView这是一个静态方法用于将布局文件绑定到当前的Activity。它返回一个绑定类在这个例子中是ActivityMainBinding的实例这个绑定类是由Data Binding库根据布局文件自动生成的。setIdol这是在ActivityMainBinding类中定义的一个方法它用于将Idol对象绑定到布局文件中定义的变量idol上。 对布局文件进行修改 接下来运行程序 Important标签和事件绑定 Important标签 若在我们创建的时候有一个值为整型怎么办例如在Idol当中将star设置为整型此时我们就需要将整形转化为字符串类型创建一个类 public class StarUtils {public static String getStar(int star) {switch (star) {case 1:return 一星;case 2:return 二星;case 3:return 三星;case 4:return 四星;}return ;} }修改xml文件 datavariablenameidoltypecom.example.databinding.Idol /import typecom.example.databinding.StarUtils/ /dataTextViewandroid:idid/dengjiandroid:layout_gravitycenterandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{StarUtils.getStar(idol.star)}android:textSize25sp /此时在创建对象的时候 Idol idol new Idol(熊大, 1);运行程序也会得到相应的结果。 import这是Data Binding布局文件中的一个XML标签用于导入Java类。type这是import标签的一个属性用于指定要导入的类或包的全限定名。 与事件绑定 设置一个按钮为点击按钮注册事件 public class EventHander {private Context context;public EventHander(Context context) {this.context context;}public void buttonOnclick(View view) {Toast.makeText(context, 喜欢, Toast.LENGTH_SHORT).show();} }将这个类添加到绑定资源当中 datavariablenameidoltypecom.example.databinding.Idol /variablenameeventbuttontypecom.example.databinding.EventHander /import typecom.example.databinding.StarUtils/ /data按钮控件进行添加绑定 android:onClick{eventbutton.buttonOnclick}此时运行程序当按下按钮 二级页面的绑定 标签引用二级页面 我们将上面布局的按钮进行删除将两个TextView控件放在一个xml文件之下使主活动的xml文件引用这个xml文件此时我们就不需要在一级页面将star进行转换将Import标签进行删除并对引用布局部分进行标签传递修改 include layoutlayout/subapp:idol{idol}/在二级页面当中TextView的代码与之前的一级页面一样注意不要忘记添加资源部分。此时运行程序的结果与之前一样。 文章到这里就结束了
http://www.hkea.cn/news/14431905/

相关文章:

  • 无锡建设局评职称网站单位的网站的建设
  • 上海php做网站津南房地产网站建设
  • 昌平知名的网站制作建设报价手机写代码的软件
  • 网站重新备案怎么做网站策划案模板
  • 网站建设费挂什么科目wordpress建站双语
  • 做网站生意影响网站收录的因素
  • 网站开发强制开启浏览器极速模式网站建设公司 关于我们
  • 上海企业网站的建设网站建设课结课感受
  • 有哪些企业会找人做网站建设网站 怎么备案
  • 网站 linux 服务器涨粉丝1元1000个
  • 自己做网站想更换网址怎么增加网站权重
  • 深圳罗湖网站建设赣州专业做网站
  • 公司网站怎么免费建博客网站开发技术
  • 如何网站全部结构建站之星模板下载网站
  • 用服务器ip怎么做网站工程交易网
  • 做网站用的国外节点服务器深圳高端品牌网站建设
  • 三明市住房与建设局网站wordpress 上传图片插件
  • 做预售的网站dede网站开发步骤
  • 一个完整的个人网站企业微信官方网站
  • 网站开发美工的任务网站系统是一个典型的
  • 手机模板网站模板官方网站welcome怎么注册
  • 青岛专业网站设计的公司潍坊百度快速排名优化
  • 锦州滨海新区城市建设规划网站怎么优化自己网站
  • 济南商城网站建设wordpress会员推广插件
  • 宁波网站关键词推广wordpress安全检测工具
  • 网页设计与网站建设试卷网络规划与设计参考文献
  • 网页设计个人网站网站建设吉金手指排名12
  • 营销型企业网站建设体会wordpress可以建站吗
  • 个人做的微网站一年要交多少钱wordpress导航对齐修改
  • 网站报名照片怎么做有专门教做蛋糕的网站