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

外贸建站用的服务器/seo软件系统

外贸建站用的服务器,seo软件系统,商城网站开发教程,知名的政府网站建设提供商简介 在Android应用开发中,Fragment和ViewModel是两个非常重要的概念,它们分别属于架构组件库的一部分,旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件,它能够作为…

简介

        在Android应用开发中,FragmentViewModel是两个非常重要的概念,它们分别属于架构组件库的一部分,旨在帮助开发者构建更加模块化、健壮且易维护的应用。

Fragment

  Fragment是Android系统提供的一种可重用的UI组件,它能够作为活动(Activity)的一部分,具有自己的生命周期,并且可以在多个Activity中使用。Fragment的设计初衷是为了支持更灵活的屏幕布局,特别是在需要适配不同屏幕尺寸和方向时。通过组合多个Fragment,开发者可以创建丰富的用户界面,并且每个Fragment都可以独立地处理用户输入、保存状态等,从而提高代码的复用性和模块化。

ViewModel

  ViewModel是Android架构组件库中的一个核心类,用于存储和管理UI相关的数据。它的主要目的分离视图(View)和数据,使得数据能够在配置变更(如屏幕旋转)时保持避免了因Activity或Fragment重建导致的数据丢失问题。ViewModel的生命周期独立于UI控制器(Activity或Fragment),确保了数据的持久性。此外,ViewModel还可以与LiveData等组件结合使用,实现数据变化的自动通知,简化了UI更新的逻辑

Fragment与ViewModel的协同工作

在实际开发中,为了实现Fragment的数据持久化和解耦,通常会为Fragment关联一个ViewModel。这样做有以下几个好处:

  1. 数据共享:如果多个Fragment需要共享数据,可以将这些数据放在一个共享的ViewModel中。这样,即使Fragment被重建,数据仍然保持不变,而且Fragment之间可以直接访问这些共享数据,无需通过Activity传递。

  2. 生命周期解耦:ViewModel不依赖于UI组件的生命周期,因此即使Fragment销毁并重新创建(比如由于配置变更),ViewModel仍然存在,保证了数据的连续性。

  3. 简化数据管理:ViewModel负责数据的获取、存储和处理,而Fragment专注于展示数据和处理用户交互,这使得代码结构更加清晰,易于维护。

一、开启绑定Binding

Step 1: 打开build.gradle(Module级别)文件。

Step 2:android闭包内,确保buildFeatures块存在,然后添加viewBinding属性并设为true

buildFeatures:

android {...buildFeatures {viewBinding = true // 注意,新版一定要有=}
}
  • 这是启用ViewBinding的推荐方式,特别是在较新的Android Gradle插件版本中。buildFeatures是一个集合了各种构建特性的开关,通过在这里设置viewBindingtrue,你告诉Gradle在构建时生成ViewBinding类。这些类让你能够以类型安全的方式访问XML布局中的视图,无需手动调用findViewById

dataBinding:

android {...dataBinding {enabled = true // 注意,新版一定要有=}
}
  • 类似地,这是启用DataBinding的方式。通过在dataBinding块内设置enabledtrue,你激活了DataBinding特性。DataBinding比ViewBinding更进一步,提供了数据和视图之间的双向绑定能力,允许在布局文件中直接使用数据对象,并支持表达式来处理数据变化,实现更复杂的UI逻辑。

viewBinding:

android {...viewBinding {enabled = true // 注意,新版一定要有=}
}

正确的配置应该遵循上述第一条提到的buildFeatures { viewBinding = true }。实际上推荐使用buildFeatures块来配置ViewBinding。选择哪种绑定技术取决于你的项目需求:简单视图绑定用ViewBinding,需要更复杂数据逻辑处理则使用DataBinding。

二、加载布局

ActivityMain:

        

// 定义MainActivity类,继承自AppCompatActivity,这是Android提供的一个Activity基类,用于兼容旧版设备
public class MainActivity extends AppCompatActivity {// 声明一个私有成员变量binding,类型为ActivityMainBinding,用于存储由Data Binding生成的绑定对象private ActivityMainBinding binding;// 重写onCreate()方法,这是Activity生命周期的第一个回调方法,用于初始化Activity@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState); // 调用父类的onCreate()方法,执行基本的初始化工作// 使用Data Binding的inflate方法从XML布局文件创建一个绑定对象// getLayoutInflater()返回LayoutInflater实例,用于将XML布局转换为View对象// ActivityMainBinding.inflate()方法将布局文件转换为ActivityMainBinding对象binding = ActivityMainBinding.inflate(getLayoutInflater());// 设置Activity的内容视图,即将绑定对象的根视图设置为Activity的布局// binding.getRoot()返回inflate生成的View对象,即整个布局的根ViewsetContentView(binding.getRoot());}
}

在这个过程中,以下步骤发生:

  1. 声明Binding对象:在MainActivity类中声明了一个ActivityMainBinding类型的私有变量bindingActivityMainBinding是Data Binding自动生成的类,用于封装和管理XML布局文件中的所有视图。

  2. 加载布局:在onCreate()方法中,首先调用super.onCreate()来执行父类的初始化过程。然后使用ActivityMainBinding.inflate()方法加载布局文件,getLayoutInflater()提供了创建布局的能力。

  3. 设置内容视图:调用setContentView()方法,并传入binding.getRoot()返回的根视图,将该视图设置为MainActivity的布局视图。这意味着MainActivity的界面将按照ActivityMainBinding所绑定的XML布局文件来渲染。

通过使用Data Binding,开发者可以直接通过binding对象访问布局文件中的所有视图,而无需调用findViewById()方法,这使得代码更加简洁、可读性更强,同时也避免了一些常见的错误,如空指针异常

ViewModel:

// 定义一个继承自ViewModel的类,用于存储界面相关的数据,保证数据在配置变化时不会丢失
public class SyFragmentViewModel extends ViewModel {// 声明一个私有成员变量mText,类型为MediatorLiveData<String>,用于存储和分发字符串数据private MediatorLiveData<String> mText;// 构造函数,初始化mText并设置其初始值public SyFragmentViewModel() {// 创建并初始化MediatorLiveData实例mText = new MediatorLiveData<>();// 设置mText的初始值mText.setValue("第一个页面");}// 公共方法,返回mText,允许外部组件观察mText的数据变化public LiveData<String> getText() {return mText;}
}

通过上述代码,SyFragmentViewModel可以被FragmentActivity使用,以观察和响应数据变化,从而实现实时更新UI的效果。

Fragment:

// 定义SyFragment类,继承自Fragment,这是Android中用于构建可重用UI块的类。
public class SyFragment extends Fragment {// 声明一个私有成员变量binding,类型为SyActivityBinding。这是Data Binding自动生成的类,// 它包含了对SyFragment所使用的XML布局文件中所有View的引用。private SyActivityBinding binding;// 重写onCreateView()方法,这是Fragment生命周期的一部分,用于创建并返回Fragment的用户界面视图。@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// 使用Data Binding的inflate方法从XML布局文件创建一个绑定对象。// 第一个参数是LayoutInflater,用于将XML布局转换为View对象;// 第二个参数是ViewGroup,表示inflate出的View是否应立即附加到该ViewGroup;// 第三个参数是一个布尔值,如果为true,inflate出的View将附加到container,否则不会。// 这里inflate方法会根据XML布局文件生成相应的View对象,并将这些View对象封装进binding对象中。binding = SyActivityBinding.inflate(inflater, container, false);// 获取inflate生成的View对象,即整个布局的根View,以便返回给onCreateView()方法。View root = binding.getRoot();// 从binding中获取TextView的引用,这一步利用了Data Binding的便利性,可以直接通过属性名访问View。final TextView textView = binding.textView;// 创建并获取SyFragmentViewModel的实例。ViewModelProvider是一个工具类,用于创建和管理ViewModel实例。// 这里的this参数告诉ViewModelProvider当前Fragment需要哪个ViewModel。SyFragmentViewModel syFragmentViewModel = new ViewModelProvider(this).get(SyFragmentViewModel.class);// 观察SyFragmentViewModel中getText()返回的LiveData对象。// observe()方法用于注册观察者,getViewLifecycleOwner()确保观察者只在Fragment可见时生效。// textView::setText是一种方法引用,表示当LiveData数据改变时,自动调用TextView的setText()方法更新UI。syFragmentViewModel.getText().observe(getViewLifecycleOwner(), textView::setText);// 返回inflate生成的根View,这将是Fragment的用户界面。return root;}// 重写onDestroy()方法,这是Fragment生命周期的一部分,当Fragment不可见时调用。// 这里设置binding为null,有助于回收资源,防止内存泄漏。@Overridepublic void onDestroy() {super.onDestroy();binding = null;}
}

        这段代码展示了如何在一个Fragment中使用Data Binding和ViewModel来构建UI,并响应数据变化。通过使用Data Binding,我们可以更简洁地访问布局中的View;通过ViewModel和LiveData,我们可以在数据变化时自动更新UI,同时保证数据在配置变更时的持久性。

ViewGroup:

        ViewGroup是一个非常重要的概念,它是View体系结构中的基础组件之一,负责组织和管理子View(包括其他ViewGroup)。简单来说,ViewGroup就是一种特殊的View,它不仅自己可以显示内容,还可以包含多个子View,并且能够控制这些子View的布局方式。

SyFragmentonCreateView()方法中,ViewGroup主要体现在inflater.inflate()方法的第二个参数——container。这里的container实际上就是一个ViewGroup,它是指定用于容纳由LayoutInflater从XML布局文件中解析出来的View组件的父容器。

当你调用SyActivityBinding.inflate(inflater, container, false)时:

  • inflaterLayoutInflater的实例,它负责读取XML布局文件,并将其转换为实际的View对象。
  • containerViewGroup的实例,代表了onCreateView()方法中返回的View将要被添加到的父容器。通常情况下,containerFragment将要附加到的Activity的主布局。
  • false作为第三个参数,意味着从XML布局文件中inflate出来的View不会立即被添加到container中。这是因为FragmentView应该由FragmentManager来管理,而不是直接由ViewGroup来管理。FragmentManager会在适当的时机将View添加到container中。

所以,在这个特定的上下文中,ViewGroup的作用主要是作为Fragment视图层次结构的一部分,为Fragment的布局提供一个容器。当Fragment变得可见时,其视图将被FragmentManager添加到指定的ViewGroup(即container)中。

这里,SyActivityBinding.inflate()方法通过LayoutInflaterViewGroupcontainer),实现了从XML布局文件到View对象的转换,并通过Data Binding的方式将这些View对象封装进SyActivityBinding对象中,便于后续的代码访问和操作。

三、布局加载比较

        binding = ActivityMainBinding.inflate(getLayoutInflater());binding = YourActivityBinding.inflate(inflater, container, false); 都使用了 Android 的 Data Binding 库来从 XML 布局文件生成对应的 Java 对象,但它们之间存在一些关键区别,主要在于 inflate 方法的调用方式和参数上。

第一种情况:

binding = ActivityMainBinding.inflate(getLayoutInflater());

这里使用的是 ActivityMainBinding 类的 inflate 方法,这个方法不需要额外的容器参数。它直接使用 getLayoutInflater() 来获取 LayoutInflater 实例,然后调用 inflate 方法生成布局。这种情况下,inflate 方法会自动找到一个合适的根视图,并且返回一个 ActivityMainBinding 类型的对象,该对象包含了布局中的所有 View。

第二种情况:

binding = YourActivityBinding.inflate(inflater, container, false);

这个版本的 inflate 方法接收三个参数:

  • inflater: 这是一个 LayoutInflater 实例,通常从父视图或者 Activity 中获取。
  • container: 这是一个可选的父视图容器,如果你想要将这个布局添加到某个已存在的 View 组中时,你需要提供这个容器。如果布局是要作为独立的视图,则可以忽略此参数。
  • attachToRoot: 这个布尔值参数决定了是否将生成的布局视图自动添加到 container 参数指定的容器中。如果设置为 false,则不会自动添加;如果设置为 true,则会自动添加到 container 中。

总结:

  • 如果你的布局是要直接设置为 Activity 的根布局,通常使用第一种方法,因为不需要考虑容器问题。
  • 如果你的布局是要作为子布局添加到某个容器中(比如在 Fragment 或者自定义 View 中),那么你应该使用第二种方法,并且要确保 attachToRoot 参数设置正确,以便于控制布局是否应该被自动添加到容器中。

在大多数情况下,Activity 的布局会直接设置为 Activity 的根视图,因此第一种情况更为常见。然而,在更复杂的场景下,例如在 Fragment 中使用 Data Binding,第二种情况则更为适用。

四、navigation

navigation创建

布局加载

代码完善:

五、menu菜单

menu创建:

Vector图标:

        new创建:

        颜色、名称等设定:

        

        finsh完成:

添加item项:

        代码完善:

切记一定要与navigation的xml代码中fragment的id一致

六、导航实现

BottomNavigationView:

fragment:

        一定要将NavHostFragment改fragment

activity中代码实现:

public class MainActivity extends AppCompatActivity {// 定义一个 ActivityMainBinding 类型的成员变量 binding,// ActivityMainBinding 是由 Data Binding 自动生成的类,用于绑定 XML 布局文件中的元素到 Java 代码。private ActivityMainBinding binding;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {// 调用父类的 onCreate 方法,这是每个 Activity 的 onCreate 方法都应该做的。super.onCreate(savedInstanceState);// 使用 Data Binding 的 inflate 方法从 XML 文件加载布局。// getLayoutInflater() 返回 LayoutInflater 实例,用于加载布局。// ActivityMainBinding.inflate 方法会解析 res/layout/activity_main.xml 文件,// 并返回一个 ActivityMainBinding 实例,其中包含布局文件中的所有视图组件。binding = ActivityMainBinding.inflate(getLayoutInflater());// 设置 Activity 的内容视图。binding.getRoot() 方法返回布局文件中的根视图。setContentView(binding.getRoot());// 通过 Data Binding 访问 BottomNavigationView 视图,其 ID 在 activity_main.xml 文件中定义。BottomNavigationView bottomNavigationView = binding.BottomNavi;// 创建 NavController 实例,用于管理应用中的导航。// Navigation.findNavController 方法需要传入一个 Context 和一个 View 的 ID,// 这里使用 R.id.fragmentContainerView 表示要查找的 NavController 管理的 Fragment 容器。NavController navController = Navigation.findNavController(this, R.id.fragmentContainerView);// 创建 AppBarConfiguration 实例,用于配置 App Bar 的行为,这里使用默认配置。// AppBarConfiguration 的构造函数可以接收多个参数来配置不同的行为,// 但在这个例子中,使用了默认的构造函数,没有进行任何配置。AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder().build();// 使用 NavigationUI.setupActionBarWithNavController 方法设置 ActionBar 与 NavController 的关联,// 这样 ActionBar 就可以根据 NavController 的状态显示相应的标题和导航项。// 第一个参数是当前 Activity,第二个参数是 NavController,第三个参数是 AppBarConfiguration。NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);// 使用 NavigationUI.setupWithNavController 方法设置 BottomNavigationView 与 NavController 的关联,// 这样 BottomNavigationView 就可以响应 NavController 的变化,显示正确的菜单项。// 第一个参数是 BottomNavigationView,第二个参数是 NavController。NavigationUI.setupWithNavController(bottomNavigationView, navController);}
}

最终效果:

相关文章:

Fragment与ViewModel(MVVM架构)

简介 在Android应用开发中&#xff0c;Fragment和ViewModel是两个非常重要的概念&#xff0c;它们分别属于架构组件库的一部分&#xff0c;旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件&#xff0c;它能够作为…...

Linux开发讲课16--- 【内存管理】页表映射基础知识2

ARM32页表和Linux页表那些奇葩的地方 ARM32硬件页表中PGD页目录项PGD是从20位开始的&#xff0c;但是为何头文件定义是从21位开始&#xff1f; 历史原因&#xff1a;Linux最初是基于x86的体系结构设计的&#xff0c;因此Linux内核很多的头文件的定义都是基于x86的&#xff0c…...

uniapp地图点击获取位置

主页面 <view class"right-content" click.stop"kilometer(item)"><view class"km">{{item.distance||0}}km</view><image src"../../static/map.png" mode""style"width: 32rpx; height: 32rpx…...

Unity程序开发:1.基本概念及操作

1. 基本概念与操作 Unity 是一个功能强大的游戏开发引擎&#xff0c;广泛用于创建2D和3D游戏。要开始开发游戏&#xff0c;了解游戏对象和组件的基本概念是必不可少的。 游戏对象与组件 什么是游戏对象&#xff08;GameObject&#xff09; 在 Unity 中&#xff0c;游戏对象…...

前端新手小白的第一个AI全栈项目---AI聊天室

前言 ok&#xff0c;大家好。- ̗̀(๑ᵔ⌔ᵔ๑)最近也是想做自己的第一个前后端分离的项目&#xff0c;刚好最近学了一点AI接口的实现。想着用接口做一个自己的ai聊天室并且尝试一下全栈式开发。中间真的解决了很多问题&#xff0c;也是成功之后也是想要将实现过程分享一下&a…...

金升阳电源被制裁,广州顶源电源模块可以完美替换

广州顶源电子科技股份有限公司,座落于国家高新技术开发区---广州科学城&#xff0c;是一家集研发、生产、销售及服务于一体的DC-DC&#xff0c;AC-DC电源的生产厂家。 公司通过了IATF16949汽车认证及ISO9001:2015质量管理体系认证。拥有专家级研发团队&#xff0c;产品研发经过…...

《数据赋能:一本书讲透数字化营销与运营》—— 从正确的数据观开始

基于数据打通的“全链路”营销是当下的“时髦”&#xff0c;应用它的前提是什么&#xff1f;深度营销和运营的关键数据如何获得&#xff1f;如何利用数据进行更精准的营销投放&#xff1f;如何利用数据优化投放的效果&#xff1f;如何促进消费者的转化&#xff0c;以及激活留存…...

JDK 24:Leyden

Project Leyden 发布了其首个早期版本(24-leyden2-8 2024/6/20)。初始版本专注于缩短 Java 应用程序的启动时间。 1.特点 提前编译 Java 方法&#xff0c;以便在应用程序在生产运行中启动时立即本地执行它们&#xff1b;提前解析常量池条目可以让 AOT 编译器生成更好的代码&a…...

对于图片转3d人脸方面的研究

1.一个开源的可以运行的项目&#xff08;face3d/README.md at master yfeng95/face3d GitHub&#xff09; 在配置好环境后&#xff0c;让我们一个一个py文件运行它&#xff08;我将给出中文注释&#xff09; 1&#xff09;1_pipeline.py 将一个3d头像的mat文件转换为jpg…...

.NET C# 八股文 代码阅读(一)

.NET C# 八股文 代码阅读&#xff08;一&#xff09; 目录 .NET C# 八股文 代码阅读&#xff08;一&#xff09;1 两种获10000个数的方式&#xff0c;哪种效率更高&#xff1f;为什么&#xff1f;2 请说出以下代码AB谁先打印&#xff0c;AB打印的值分别为多少&#xff1f;3 关于…...

C++用Crow实现一个简单的Web程序,实现动态页面,向页面中输入数据并展示

Crow是一个轻量级、快速的C微框架&#xff0c;用于构建Web应用程序和RESTful API。 将处理前端页面的POST请求以添加数据的逻辑添加到 /submit 路由中&#xff0c;并添加了一个新的路由 / 用于返回包含输入框、按钮和表格的完整页面。当用户向表格添加数据时&#xff0c;JavaS…...

南信大尹志聪教授为一作在顶级综合性期刊《Natl. Sci. Rev.》发文:传统梅雨停摆,江南缘何不再多烟雨?

文章简介 论文名称&#xff1a;Traditional Meiyu–Baiu has been suspended by global warming 第一作者及单位&#xff1a;尹志聪(教授|南京信息工程大学大气科学学院) 通讯作者及单位&#xff1a;王会军&#xff08;院士|南京信息工程大学大气科学学院&#xff09; 文章发…...

程序员如何用ChatGPT解决常见编程问题:实例解析

引言 在现代编程的世界中&#xff0c;技术进步日新月异&#xff0c;程序员们面临着各种各样的挑战和问题。解决这些问题的过程中&#xff0c;找到合适的工具至关重要。ChatGPT作为一种先进的人工智能语言模型&#xff0c;能够帮助程序员迅速、高效地解决常见的编程问题。本文将…...

初识 SpringMVC,运行配置第一个Spring MVC 程序

1. 初识 SpringMVC&#xff0c;运行配置第一个Spring MVC 程序 文章目录 1. 初识 SpringMVC&#xff0c;运行配置第一个Spring MVC 程序1.1 什么是 MVC 2. Spring MVC 概述2.1 Spring MVC 的作用&#xff1a; 3. 运行配置第一个 Spring MVC 程序3.1 第一步&#xff1a;创建Mave…...

STM32F1+HAL库+FreeTOTS学习1——FreeRTOS入门

STM32F1HAL库FreeTOTS学习1——FreeRTOS入门 裸机开发与操作系统嵌入式操作系统简介FreeRTOS简介FreeRTOS的几个重要概念任务调度器任务状态状态列表 裸机开发与操作系统 在以往的嵌入式学习中&#xff0c;我们最常用的就是裸机开发&#xff0c;所谓裸机开发就是指在没有操作系…...

杭州代理记账报税全程托管专业实力全面指南

杭州代理记税报税服务可以为企业提供全程托管财务管理解决方案&#xff0c;确保企业的财务工作专业、高效、合规。以下是杭州代理记税报税服务全面指南&#xff1a; https://www.9733.cn/news/detail/185.html 一、代理记账报税服务的内容 基础服务&#xff1a; 每日记&#xf…...

PHP 界的扛把子 Swoole 异步通信利器

大家好&#xff0c;我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole &#xff0c;也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧&#xff0c;我们项目组之前要为《香港 01》开发一个积分系统的项目&#xff0c;这个系统的主要功能包…...

40.连接假死-空闲检测-发送心跳

连接假死情况 1.网络设备出现故障,例如网卡,机房等。底层的TCP连接已经断开,但应用程序没有感知到,仍然占着资源。 2.公网网络不稳定,出现丢包。若果连续出现丢包,这时现象就是客户端数据发不出去,服务端也一直收不到数据,就这么一直耗着。 3.应用程序线程阻塞,无法…...

hdfs高可用文件系统架构

1、整体架构 2、角色简介 2.1、namenode NameNode 是 HDFS 集群中的核心组件&#xff0c;负责管理文件系统的元数据、处理客户端请求、管理数据块、确保数据完整性和高可用性。由于其重要性&#xff0c;NameNode 的性能和可靠性直接影响整个 HDFS 集群的性能和可靠性。在生产…...

从官方源码精简出第1个FreeRTOS程序

一、下载官方源码 1、打开百度搜索freerots&#xff0c;找到官网:FreeRTOS官网 2、将源码解压到没有中文目录的路径下 二、删减目录 1、删除FreeRTOS-Plus和tools 2、删除FreeRTOS/Demo下除CORTEX_STM32F103_Keil外的所有文件 3、删除FreeRTOS\Source\portable下除RVDS和MemM…...

谷歌上搞下来的,无需付费,可以收藏!

在数字化时代&#xff0c;我们越来越依赖于智能设备来获取信息和知识。中国智谋App正是这样一款应用&#xff0c;它将中国古代的智慧与谋略书籍带入了我们的移动设备&#xff0c;让我们能够随时随地学习和领悟。而且提供文言文的原文和译文。 软件下载方式&#xff1a;谷歌上搞…...

宿主机无法通过ip连接wsl2解决方案

文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT&#xff0c;建议修改为镜像模式。在C:\Users\<User…...

Ruby编程语言学习

学习Ruby编程语言&#xff0c;你可以按照以下步骤进行&#xff1a; ### 1. 基础知识入门 #### 安装Ruby - 访问Ruby官网&#xff08;https://www.ruby-lang.org/&#xff09;下载适合你操作系统的版本。 - 对于Linux用户&#xff0c;可以使用包管理器安装。 #### 学习资源 -…...

Redis实战—基于setnx的分布式锁与Redisson

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…...

ARM功耗管理框架之LPI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理框架&#xff1f;SCP&#xff1f;PPU&#xff1f;LPI&#xff1f;之间的关系&#xff1f;如何配合&#xff1f; 目录 一、功耗管理框架中的LPI 二、LPI分类 三、Q-Channel和P-Channel对比 四、Q-Channel和P-Ch…...

Unity太空避障Demo总结

太空避障&#xff1a;主要是实现飞机躲避子弹 面板基类、音乐类、排行榜类、json等等都和上一篇Unity坦克迷宫Demo总结一样&#xff0c;太空避障主要是对四元数的练习和使用 1.选择飞机面板 &#xff08;1&#xff09;通过左右按钮对显示的模型进行切换 &#xff08;2&#xff…...

SpringSecurity-重写默认配置

重写UserDetailService组件 1.注入Bean的方式 /*** author: coffee* date: 2024/6/22 21:22* description: 重写springsecurity默认组件&#xff1a;注入Bean的方式*/Configuration public class ProjectConfig {/*** 重写userDetailsService组件*/Beanpublic UserDetailsSer…...

C# 判断值是否在枚举里

你还在代码里面通篇通过数字的定义类型。比如type为1 表示xx,type为2 表示yy吗&#xff1f;然后程序里面通过数字1和2来判断吗&#xff1f;比如下面类似的代码&#xff1a; if(type1){ //.... } else if(type2){ //... } else if(type3){ //... } 老鸟们一般都会用枚举来定义…...

Interview preparation--elasticSearch倒排索引原理

搜索引擎应该具备哪些要求 查询速度快 优秀的索引结构设计高效率的压缩算法快速的编码和解码速度 结果准确 ElasiticSearch 中7.0 版本之后默认使用BM25 评分算法ElasticSearch 中 7.0 版本之前使用 TP-IDF算法 倒排索引原理 当我们有如下列表数据信息&#xff0c;并且系统…...

银河麒麟高级服务器操作系统V10SP2(X86)配置bond0的mac地址为指定子网卡的mac地址

银河麒麟高级服务器操作系统V10SP2&#xff08;X86&#xff09;配置bond0的mac地址为指定子网卡的mac地址 一 系统环境二 删除和备份原有配置2.1 down掉bond02.2 备份之前的bond配置到/root/bak2.3 删除bond配置&#xff08;网卡文件根据实际情况变化&#xff09; 三 新建bond0…...