Android LifecycleOwner 闪退,java 继承、多态特性!
1. 闪退
同意隐私政策后,启动进入游戏 Activity 闪退
getLifecycle NullPointerException 空指针异常
FATAL EXCEPTION: main
Process: com.primer.aa.gg, PID: 15722
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.primer.aa.gg/com.android.boot.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle com.primer.game.LifecycleManager.getLifecycle()' on a null object referenceat android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4529)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4822)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:118)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:153)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:104)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3078)at android.os.Handler.dispatchMessage(Handler.java:117)at android.os.Looper.loopOnce(Looper.java:210)at android.os.Looper.loop(Looper.java:302)at android.app.ActivityThread.main(ActivityThread.java:9668)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:601)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1062)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.lifecycle.Lifecycle com.primer.game.LifecycleManager.getLifecycle()' on a null object referenceat com.primer.unitybridge.UniWbActivity.getLifecycle(UniWbActivity.java:387)at androidx.activity.ComponentActivity.<init>(ComponentActivity.java:221)at androidx.fragment.app.FragmentActivity.<init>(FragmentActivity.java:103)at androidx.appcompat.app.AppCompatActivity.<init>(AppCompatActivity.java:94)at com.google.androidgamesdk.GameActivity.<init>(GameActivity.java:58)at com.unity3d.player.UnityPlayerGameActivity.<init>(UnityPlayerGameActivity.java:20)at com.unity3d.player.UnityPlayerActivity.<init>(UnityPlayerActivity.java:3)at com.primer.unitybridge.UniWbActivity.<init>(UniWbActivity.java:53)at com.android.boot.MainActivity.<init>(MainActivity.java:56)at java.lang.Class.newInstance(Native Method)at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)at android.app.Instrumentation.newActivity(Instrumentation.java:1392)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4508)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4822) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:118) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:153) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:104) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3078) at android.os.Handler.dispatchMessage(Handler.java:117) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:302) at android.app.ActivityThread.main(ActivityThread.java:9668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:601) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1062)
2. 分析
2.1 源码追溯
继承关系
MainActivityUniWbActivityUnityPlayerGameActivityGameActivityAppCompatActivityFragmentActivityComponentActivityActivity
Activity 来源
- MainActivity:游戏页面
- UniWbActivity:游戏页面
- UnityPlayerGameActivity:游戏页面
- GameActivity:依赖
androidx.games:games-activity:3.0.5
- AppCompatActivity:依赖
androidx.appcompat:appcompat:1.3.1
- FragmentActivity:依赖
androidx.fragment:fragment:1.3.6
- ComponentActivity:依赖
androidx.activity:activity:1.2.4
- Activity:依赖 Android API 31
接口实现
-
UniWbActivity:实现接口
LifecycleOwner
- 重写
getLifecycle
方法(getLifecycle 里面初始化) - getLifecycle 里面调用成员变量直接 new 的 LifecycleManager 【注:这里是闪退关键,下面使用例子说明】
- 重写
-
ComponentActivity:实现接口
LifecycleOwner
-
Activity:实现接口 implements
LifecycleOwner
详细看堆栈日志:
他是在类实例初始化init
方法里面调用getLifecycle
抛出异常
跟进源码到androidx.activity.ComponentActivity
结合堆栈 <init>
方案发现其构造函数调用了getLifecycle()
1、我们知道类的继承:实例化一个对象,先会执行父类的构造,再执行子类的构造方法
所以结合上面的类继承关系
可知:
- 先执行父类 ComponentActivity 构造方法
(里面调用了 getLifecycle)
- 再执行子类 UniWbActivity 构造方法
2、还知道类的多态:如果父类和子类都实现了同一个接口,并且在父类中调用了接口方法,实际执行的是子类重写的接口方法实现
所以综上可知:
- 会执行 UniWbActivity 里面重写的 getLifecycle 方法
这样看堆栈就对得上了,执行 ComponentActivity.<init>
之后跳到UniWbActivity.getLifecycle
执行重写方法
2.2 问题复现
为什么会空指针?无非就是对象未实例化就调用!
为什么没有执行实例化对象?我根据源码写 Demo 复现
源码是怎么样的
- 父类和子类实现同一个接口
- 父类在构造函数里,调用实现的方法
- 子类 new 一个成员变量
- 子类实现的方法里调用成员变量实例
根据上面步骤编码,实例化子类执行,问题复现,出现空指针异常!
//共同接口
public interface AnimalInterface {public void eat();
}
//父类
public class Parent implements AnimalInterface {static {System.out.println("父类:cinit 静态初始化方法");}Parent() {System.out.println("父类:init 初始化方法(构造方法)");eat();}@Overridepublic void eat() {System.out.println("父类:eat");}
}
//子类
public class Child extends Parent implements AnimalInterface {private Cat cat = new Cat();static {System.out.println("子类:cinit 静态初始化方法");}Child() {System.out.println("子类:init 初始化方法(构造方法)");}@Overridepublic void eat() {System.out.println("子类:eat");cat.eatFish();}
}
//成员对象
public class Cat {static {System.out.println("Cat:cinit 静态初始化方法");}Cat() {System.out.println("Cat:init 初始化方法(构造方法)");}public void eatFish() {System.out.println("成员变量:猫吃鱼");}
}
//运行代码
public interface Main {public static void main(String[] args) {new Child();}
}
2.3 继续思考
为什么子类里面的成员对象 Cat
没有执行 new 实例化?显然是代码执行顺序问题!
怎么验证是执行顺序问题呢?把子类里面//cat.eatFish();
注释掉再运行看看输出什么
很容易看出:
- 先是执行子类重写的 eat 方法
- 再执行成员变量 cat 的初始化
所以导致空指针异常!
不难发现,其实就是代码执行顺序的问题
2.4 产生错觉
调整代码执行顺序,使成员变量 Cat 的初始化先于子类 eat 执行即可。
可以把成员变量成员变量 cat 实例化写到静态代码块里,
这样 Child 的静态代码块先执行实例化 cat 再调用 eat 方法不会产生空指针异常了
public class Child extends Parent implements AnimalInterface {private static Cat cat;static {System.out.println("子类:cinit 静态初始化方法");cat = = new Cat();}Child() {System.out.println("子类:init 初始化方法(构造方法)");}@Overridepublic void eat() {System.out.println("子类:eat");cat.eatFish();}
}
以为万事大吉就此结束
2.5 新的错误
谁知道操作应用进入后台时出现了新的崩溃
重新复盘了,我的代码时这样的:
- AppCompatActivity 的父类 ComponentActivity 实现了 LifecycleOwner,并重写 getLifecycle 方法
- 这里我使用静态的 LifecycleRegistry,并重写 getLifecycle
package com.example.javademo;import android.os.Bundle;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;public class MainActivity extends AppCompatActivity implements LifecycleOwner {private static LifecycleRegistry LIFECYCLE_REGISTRY;private static final LifecycleOwner LIFECYCLE_OWNER = new LifecycleOwner() {@NonNull@Overridepublic Lifecycle getLifecycle() {return LIFECYCLE_REGISTRY;}};private TestActivityLifeObserver testActivityLifeObserver = new TestActivityLifeObserver();static {//有问题的代码:onpause 执行闪退,LifecycleOwner 已被回收导致空指针LIFECYCLE_REGISTRY = new LifecycleRegistry(new LifecycleOwner() {@NonNull@Overridepublic Lifecycle getLifecycle() {return LIFECYCLE_REGISTRY;}});}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});getLifecycle().addObserver(testActivityLifeObserver);LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);}@Overrideprotected void onStart() {super.onStart();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_START);}@Overrideprotected void onResume() {super.onResume();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);}@Overrideprotected void onPause() {super.onPause();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);}@Overrideprotected void onStop() {super.onStop();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_STOP);}@Overrideprotected void onDestroy() {super.onDestroy();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);LIFECYCLE_REGISTRY.removeObserver(testActivityLifeObserver);}@NonNull@Overridepublic Lifecycle getLifecycle() {return LIFECYCLE_REGISTRY;}
}
package com.example.javademo;import android.util.Log;import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;public class TestActivityLife implements DefaultLifecycleObserver {private final String TAG = "ceshi";@Overridepublic void onCreate(@NonNull LifecycleOwner owner) {Log.d(TAG, "onCreate: TestActivityLife");}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {Log.d(TAG, "onStart: TestActivityLife");}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {Log.d(TAG, "onResume: TestActivityLife");}@Overridepublic void onPause(@NonNull LifecycleOwner owner) {Log.d(TAG, "onPause: TestActivityLife");}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {Log.d(TAG, "onStop: TestActivityLife");}@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {Log.d(TAG, "onDestroy: TestActivityLife");}
}
定位源码是 lifecycleOwner.get()
为空
原来弱引用 lifecycleOwner 就是静态代码块 new 的那个内部类 LifecycleOwner,应该是被回收了导致的空指针,
所以如何确保这个对象不轻易被回收?
open class LifecycleRegistry private constructor(provider: LifecycleOwner,private val enforceMainThread: Boolean
) : Lifecycle() {private val lifecycleOwner: WeakReference<LifecycleOwner>init {// LifecycleOwner 就是lifecycleOwner = WeakReference(provider)}}
强引用、弱引用
- 如果在静态代码块中使用弱引用保存内部类对象,一旦静态代码块执行完毕,就没有任何强引用指向该对象了。 在下一次垃圾回收时,该对象很可能被回收。 除非有其他强引用指向该对象
- 对象被声明为 static 时,它属于类本身,而不是类的实例。 会一直存在于内存中,直到类被卸载,静态变量的生命周期与类的生命周期相同,可以理解为他是强引用,不易被回收
把 LifecycleRegistry 代码抽象出来时这样的:
//弱引用,所以后面你应该回收private final WeakReference<LifecycleOwner> mLifecycleOwner;public LifecycleRegistry(@NonNull LifecycleOwner provider) {mLifecycleOwner = new WeakReference<>(provider);}
调整之后的代码,确保 obj 不易被回收
static Object obj = new Object();WeakReference<Object> staticWeakReference = new WeakReference<>(obj);
- obj: 这是一个静态变量,直接指向 new Object() 创建的对象。这是一个强引用。
- staticWeakReference: 这是一个静态变量,保存了一个指向 obj 指向的同一个对象的弱引用。
关键在于,obj 这个强引用仍然存在。即使你创建了一个弱引用 staticWeakReference,obj 仍然持有对对象的强引用,这会阻止垃圾回收器回收该对象
3. 解决
那么把 LifecycleOwner 也设置成一个静态对象不久可以了吗
package com.example.javademo;import android.os.Bundle;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;public class MainActivity extends AppCompatActivity implements LifecycleOwner {private static final LifecycleRegistry LIFECYCLE_REGISTRY;private static final LifecycleOwner LIFECYCLE_OWNER = new LifecycleOwner() {@NonNull@Overridepublic Lifecycle getLifecycle() {return LIFECYCLE_REGISTRY;}};private TestActivityLifeObserver testActivityLifeObserver = new TestActivityLifeObserver();static {//LIFECYCLE_OWNER 使用静态对象,避免被回收LIFECYCLE_REGISTRY = new LifecycleRegistry(LIFECYCLE_OWNER);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});getLifecycle().addObserver(testActivityLifeObserver);LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);}@Overrideprotected void onStart() {super.onStart();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_START);}@Overrideprotected void onResume() {super.onResume();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);}@Overrideprotected void onPause() {super.onPause();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);}@Overrideprotected void onStop() {super.onStop();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_STOP);}@Overrideprotected void onDestroy() {super.onDestroy();LIFECYCLE_REGISTRY.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);//最后别忘了移除观察者,避免内存泄露LIFECYCLE_REGISTRY.removeObserver(testActivityLifeObserver);}@NonNull@Overridepublic Lifecycle getLifecycle() {return LIFECYCLE_REGISTRY;}
}
相比随着 Android 的不断更新 Activity 变成了 ComponentActivity,内部已实现生命周期
LifecycleOwner,随着逐渐升级到新版本 androidx.activity:activity,相比不久的将来你也要适配吧!
除了上述处理当然也有其他方法处理,只是恰巧我接手的这个老项目就是这样的场景,也不想改动太多就这样吧 😄
相关文章:

Android LifecycleOwner 闪退,java 继承、多态特性!
1. 闪退 同意隐私政策后,启动进入游戏 Activity 闪退 getLifecycle NullPointerException 空指针异常 FATAL EXCEPTION: main Process: com.primer.aa.gg, PID: 15722 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.primer.aa.…...
PHP 完整表单实例
PHP 完整表单实例 引言 表单是网站与用户交互的重要方式,尤其是在收集用户输入数据时。PHP 作为一种流行的服务器端脚本语言,在处理表单数据方面具有强大的功能。本文将提供一个完整的 PHP 表单实例,涵盖表单创建、数据收集、验证和存储等关…...

深度学习学习笔记(32周)
目录 摘要 abstract 1 Mask R-CNN 2 RoI Align 2.1 RoIPool实验 2.2 RoIAlign实验 3 Mask Branch(FCN) 4 其他细节 4.1 Mask R-CNN损失 4.2 Mask分支损失 4.3 Mask Branch预测使用 摘要 Mask R-CNN是2017年发表的文章,一作是何恺明大神,没错就…...

Web3 开发者的机遇与挑战:技术趋势与职业发展
随着 Web3 技术的迅速发展,互联网的未来正朝着去中心化、用户主权、隐私保护等方向演进。作为 Web3 生态的核心力量,Web3 开发者在推动这一变革中扮演着至关重要的角色。无论是在区块链技术、智能合约开发、去中心化应用(DApp)的构…...
探索robots.txt:网站管理者的搜索引擎指南
在数字时代,网站如同企业的在线名片,其内容和结构对搜索引擎的可见性至关重要。而在这背后,有一个默默工作的文件——robots.txt,它扮演着搜索引擎与网站之间沟通桥梁的角色。本文将深入探讨robots.txt的功能、编写方法及其在现代…...

LM Studio本地调用模型的方法
首先需要下载LM Studio,(LM Studio - Discover, download, and run local LLMs)安装好后,需要对index.js文件进行修改,主要是对相关源hugging face的地址修改。 以macOS为例: cd /Applications/LM\ Studi…...

防火墙安全综合实验
防火墙安全综合实验 一、拓扑信息 二、需求及配置 实验步骤 需求一:根据下表,完成相关配置 设备接口VLAN接口类型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List:10 20Trunk 1、创建vlan10和vlan20 2、将接口划分到对应…...

uniapp 编译生成鸿蒙正式app步骤
1,在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件(构建-生成私钥和证书请求文件) 2,华为开发者平台 根据上面生成的csr文件新增cer和p7b文件,分发布和测试 3,在最新版本DevEco-Studio工具 文…...

【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。 首先&a…...

ubuntu安装VMware报错/dev/vmmon加载失败
ubuntu安装VMware报错/dev/vmmon加载失败,解决步骤如下: step1:为vmmon和vmnet组件生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout VMW.priv -outform DER -out VMW.der -nodes -days 36500 -subj "/CNVMware/"ste…...
web前端布局--使用element中的Container布局容器
前端页面,跟Qt中一样,都是有布局设置的。 先布局,然后再在各布局中添加显示的内容。 Element网站布局容器:https://element.eleme.cn/#/zh-CN/componet/container 1.将element相应的布局容器代码layout,粘贴到vue项…...

手写一个C++ Android Binder服务及源码分析
手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…...
git rebase发生冲突时 ☞ 解决冲突
参考:特性分支 Rebase 主干分支...

【通俗易懂说模型】反向传播(附多元分类与Softmax函数)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(6)
7.3. 查询计划相关操作符 48)Key Lookup:该操作符对一个有簇索引的表进行书签查找。参数列包含簇索引的名字和用于查找簇索引中数据行的簇键。该操作符总是伴随一个Nested Loops操作符。如果其参数列中出现WITH PREFETCH子句,则查询处理器已决定使用异步预取(预读,read-ah…...
计算机视觉的研究方向、发展历程、发展前景介绍
以下将分别从图像分类、目标检测、语义分割、图像分割(此处应主要指实例分割)四个方面,为你介绍研究生人工智能计算机视觉领域的应用方向、发展历程以及发展前景。 文章目录 1.图像分类应用方向发展历程发展前景 2.目标检测应用方向发展历程…...
反转字符串-双指针法,
在 Java 中,使用 双指针法 反转字符串是一种高效且直观的方法。以下是详细的解析和代码实现。 1. 双指针法的核心思想 使用两个指针:一个指向字符串的起始位置(left),另一个指向字符串的末尾位置(right&…...

亚博microros小车-原生ubuntu支持系列 27、手掌控制小车运动
背景知识 本节跟上一个测试类似:亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动-CSDN博客 都是基于MediaPipe hands做手掌、手指识别的。 为了方便理解,在贴一下手指关键点分布。手掌位置就是靠第9点来识别的。 2、程序说明…...
STM32 HAL库 CANbus通讯(C语言)
#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...
ML.NET库学习005:基于机器学习的客户细分实现与解析
文章目录 ML.NET库学习005:基于机器学习的客户细分实现与解析项目主要目的和原理目的原理 项目概述实现的主要功能主要流程步骤使用的主要函数方法关键技术 主要功能和步骤功能详细解读详细步骤解析 数据集及其处理步骤数据集处理步骤关键处理步骤原理1. 数据清洗与…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...