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

Jetpack之Lifecycle应用与源码分析

Build lifecycle-aware components that can adjust behavior based on the current lifecycle state of an activity or fragment.

上面是源于官网的定义,简单翻译就是说Lifecycle的作用就是基于当前的Activity或者Fragment的生命周期当前状态构建可感知生命周期的组件。

Lifecycle组件涉及一个类和两个接口,一个类是Lifecycle,两个接口分别是LifecycleObserverLifecycleOwner

一、Lifecycle

在这里插入图片描述

1.1、源码

public abstract class Lifecycle {@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)@NonNullAtomicReference<Object> mInternalScopeRef = new AtomicReference<>();@MainThread//添加观察者public abstract void addObserver(@NonNull LifecycleObserver observer);@MainThread//移除观察者public abstract void removeObserver(@NonNull LifecycleObserver observer);@MainThread@NonNull//获取当前状态public abstract State getCurrentState();@SuppressWarnings("WeakerAccess")public enum Event {/*** Constant for onCreate event of the {@link LifecycleOwner}.*/ON_CREATE,/*** Constant for onStart event of the {@link LifecycleOwner}.*/ON_START,/*** Constant for onResume event of the {@link LifecycleOwner}.*/ON_RESUME,/*** Constant for onPause event of the {@link LifecycleOwner}.*/ON_PAUSE,/*** Constant for onStop event of the {@link LifecycleOwner}.*/ON_STOP,/*** Constant for onDestroy event of the {@link LifecycleOwner}.*/ON_DESTROY,/*** An {@link Event Event} constant that can be used to match all events.*/ON_ANY;/*** Returns the {@link Lifecycle.Event} that will be reported by a {@link Lifecycle}* leaving the specified {@link Lifecycle.State} to a lower state, or {@code null}* if there is no valid event that can move down from the given state.** @param state the higher state that the returned event will transition down from* @return the event moving down the lifecycle phases from state*/@Nullable//从当前状态降级的事件public static Event downFrom(@NonNull State state) {switch (state) {//从CREATED降级的是ON_DESTROY事件case CREATED:return ON_DESTROY;//从STARTED降级的是ON_STOP事件case STARTED:return ON_STOP;//从RESUMED降级的是ON_PAUSE事件case RESUMED:return ON_PAUSE;default:return null;}}/*** Returns the {@link Lifecycle.Event} that will be reported by a {@link Lifecycle}* entering the specified {@link Lifecycle.State} from a higher state, or {@code null}* if there is no valid event that can move down to the given state.** @param state the lower state that the returned event will transition down to* @return the event moving down the lifecycle phases to state*/@Nullable//降级到当前状态的事件public static Event downTo(@NonNull State state) {switch (state) {//降级到DESTROYED状态的是ON_DESTROY事件case DESTROYED:return ON_DESTROY;//降级到CREATED状态的是ON_STOP事件case CREATED:return ON_STOP;//降级到STARTED状态的是ON_PAUSE事件case STARTED:return ON_PAUSE;default:return null;}}/*** Returns the {@link Lifecycle.Event} that will be reported by a {@link Lifecycle}* leaving the specified {@link Lifecycle.State} to a higher state, or {@code null}* if there is no valid event that can move up from the given state.** @param state the lower state that the returned event will transition up from* @return the event moving up the lifecycle phases from state*/@Nullable//从该状态升级的事件public static Event upFrom(@NonNull State state) {switch (state) {//从INITIALIZED状态升级的事件为ON_CREATEcase INITIALIZED:return ON_CREATE;//从CREATED状态升级的事件为ON_STARTcase CREATED:return ON_START;//从STARTED状态升级的事件为ON_RESUMEcase STARTED:return ON_RESUME;default:return null;}}/*** Returns the {@link Lifecycle.Event} that will be reported by a {@link Lifecycle}* entering the specified {@link Lifecycle.State} from a lower state, or {@code null}* if there is no valid event that can move up to the given state.** @param state the higher state that the returned event will transition up to* @return the event moving up the lifecycle phases to state*/@Nullable//升级到该状态的事件public static Event upTo(@NonNull State state) {switch (state) {//升级到CREATED状态是ON_CREATE事件case CREATED:return ON_CREATE;//升级到STARTED状态是ON_START事件case STARTED:return ON_START;//升级到RESUMED状态是ON_RESUME事件case RESUMED:return ON_RESUME;default:return null;}}/*** Returns the new {@link Lifecycle.State} of a {@link Lifecycle} that just reported* this {@link Lifecycle.Event}.** Throws {@link IllegalArgumentException} if called on {@link #ON_ANY}, as it is a special* value used by {@link OnLifecycleEvent} and not a real lifecycle event.** @return the state that will result from this event*/@NonNullpublic State getTargetState() {switch (this) {case ON_CREATE:case ON_STOP:return State.CREATED;case ON_START:case ON_PAUSE:return State.STARTED;case ON_RESUME:return State.RESUMED;case ON_DESTROY:return State.DESTROYED;case ON_ANY:break;}throw new IllegalArgumentException(this + " has no target state");}}/*** Lifecycle states. You can consider the states as the nodes in a graph and* {@link Event}s as the edges between these nodes.*/@SuppressWarnings("WeakerAccess")public enum State {/*** Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch* any more events. For instance, for an {@link android.app.Activity}, this state is reached* <b>right before</b> Activity's {@link android.app.Activity#onDestroy() onDestroy} call.*/DESTROYED,/*** Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is* the state when it is constructed but has not received* {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.*/INITIALIZED,/*** Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached in two cases:* <ul>*     <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;*     <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.* </ul>*/CREATED,/*** Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached in two cases:* <ul>*     <li>after {@link android.app.Activity#onStart() onStart} call;*     <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.* </ul>*/STARTED,/*** Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state* is reached after {@link android.app.Activity#onResume() onResume} is called.*/RESUMED;/*** Compares if this State is greater or equal to the given {@code state}.** @param state State to compare with* @return true if this State is greater or equal to the given {@code state}*/public boolean isAtLeast(@NonNull State state) {return compareTo(state) >= 0;}}
}

从源码可以得知Lifecycle定义了三个方法和两个枚举:
三个方法:
1、addObserver 用于添加观察者
2、removeObserver 用于移除观察者
3、获取当前的状态
两个枚举:
1、Event 事件
2、State 状态

宿主的生命周期和状态转换的模型图如下:
在这里插入图片描述

1.2、直接子类LifecycleRegistry

1.2.1 源码

package androidx.lifecycle;import static androidx.lifecycle.Lifecycle.State.DESTROYED;
import static androidx.lifecycle.Lifecycle.State.INITIALIZED;import android.annotation.SuppressLint;import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.arch.core.executor.ArchTaskExecutor;
import androidx.arch.core.internal.FastSafeIterableMap;import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;public class LifecycleRegistry extends Lifecycle {private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =new FastSafeIterableMap<>();private State mState;//弱引用宿主对象private final WeakReference<LifecycleOwner> mLifecycleOwner;private int mAddingObserverCounter = 0;private boolean mHandlingEvent = false;private boolean mNewEventOccurred = false;private ArrayList<State> mParentStates = new ArrayList<>();private final boolean mEnforceMainThread;public LifecycleRegistry(@NonNull LifecycleOwner provider) {this(provider, true);}private LifecycleRegistry(@NonNull LifecycleOwner provider, boolean enforceMainThread) {mLifecycleOwner = new WeakReference<>(provider);mState = INITIALIZED;mEnforceMainThread = enforceMainThread;}@Deprecated@MainThreadpublic void markState(@NonNull State state) {enforceMainThreadIfNeeded("markState");setCurrentState(state);}//设置当前状态@MainThreadpublic void setCurrentState(@NonNull State state) {enforceMainThreadIfNeeded("setCurrentState");moveToState(state);}//处理生命周期事件public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {enforceMainThreadIfNeeded("handleLifecycleEvent");moveToState(event.getTargetState());}//状态转移private void moveToState(State next) {if (mState == next) {return;}if (mState == INITIALIZED && next == DESTROYED) {throw new IllegalStateException("no event down from " + mState);}mState = next;if (mHandlingEvent || mAddingObserverCounter != 0) {mNewEventOccurred = true;// we will figure out what to do on upper level.return;}mHandlingEvent = true;sync();mHandlingEvent = false;if (mState == DESTROYED) {mObserverMap = new FastSafeIterableMap<>();}}//是否同步private boolean isSynced() {if (mObserverMap.size() == 0) {return true;}State eldestObserverState = mObserverMap.eldest().getValue().mState;State newestObserverState = mObserverMap.newest().getValue().mState;return eldestObserverState == newestObserverState && mState == newestObserverState;}//计算目标状态private State calculateTargetState(LifecycleObserver observer) {Map.Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);State siblingState = previous != null ? previous.getValue().mState : null;State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1): null;return min(min(mState, siblingState), parentState);}//增加观察者@Overridepublic void addObserver(@NonNull LifecycleObserver observer) {enforceMainThreadIfNeeded("addObserver");State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);if (previous != null) {return;}LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {// it is null we should be destroyed. Fallback quicklyreturn;}boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;State targetState = calculateTargetState(observer);mAddingObserverCounter++;while ((statefulObserver.mState.compareTo(targetState) < 0&& mObserverMap.contains(observer))) {pushParentState(statefulObserver.mState);final Event event = Event.upFrom(statefulObserver.mState);if (event == null) {throw new IllegalStateException("no event up from " + statefulObserver.mState);}statefulObserver.dispatchEvent(lifecycleOwner, event);popParentState();// mState / subling may have been changed recalculatetargetState = calculateTargetState(observer);}if (!isReentrance) {// we do sync only on the top level.sync();}mAddingObserverCounter--;}private void popParentState() {mParentStates.remove(mParentStates.size() - 1);}private void pushParentState(State state) {mParentStates.add(state);}//移除观察者@Overridepublic void removeObserver(@NonNull LifecycleObserver observer) {enforceMainThreadIfNeeded("removeObserver");mObserverMap.remove(observer);}//获取观察者数量@SuppressWarnings("WeakerAccess")public int getObserverCount() {enforceMainThreadIfNeeded("getObserverCount");return mObserverMap.size();}//获取当前状态@NonNull@Overridepublic State getCurrentState() {return mState;}//升级状态private void forwardPass(LifecycleOwner lifecycleOwner) {Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =mObserverMap.iteratorWithAdditions();while (ascendingIterator.hasNext() && !mNewEventOccurred) {Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();ObserverWithState observer = entry.getValue();while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {pushParentState(observer.mState);final Event event = Event.upFrom(observer.mState);if (event == null) {throw new IllegalStateException("no event up from " + observer.mState);}observer.dispatchEvent(lifecycleOwner, event);popParentState();}}}//降级状态private void backwardPass(LifecycleOwner lifecycleOwner) {Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> descendingIterator =mObserverMap.descendingIterator();while (descendingIterator.hasNext() && !mNewEventOccurred) {Map.Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();ObserverWithState observer = entry.getValue();while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred&& mObserverMap.contains(entry.getKey()))) {Event event = Event.downFrom(observer.mState);if (event == null) {throw new IllegalStateException("no event down from " + observer.mState);}pushParentState(event.getTargetState());observer.dispatchEvent(lifecycleOwner, event);popParentState();}}}//同步状态private void sync() {LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"+ "garbage collected. It is too late to change lifecycle state.");}while (!isSynced()) {mNewEventOccurred = false;// no need to check eldest for nullability, because isSynced does it for us.if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {backwardPass(lifecycleOwner);}Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();if (!mNewEventOccurred && newest != null&& mState.compareTo(newest.getValue().mState) > 0) {forwardPass(lifecycleOwner);}}mNewEventOccurred = false;}@SuppressLint("RestrictedApi")private void enforceMainThreadIfNeeded(String methodName) {if (mEnforceMainThread) {if (!ArchTaskExecutor.getInstance().isMainThread()) {throw new IllegalStateException("Method " + methodName + " must be called on the "+ "main thread");}}}@VisibleForTesting@NonNullpublic static LifecycleRegistry createUnsafe(@NonNull LifecycleOwner owner) {return new LifecycleRegistry(owner, false);}static State min(@NonNull State state1, @Nullable State state2) {return state2 != null && state2.compareTo(state1) < 0 ? state2 : state1;}//带有状态信息的观察者static class ObserverWithState {State mState;LifecycleEventObserver mLifecycleObserver;ObserverWithState(LifecycleObserver observer, State initialState) {mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);mState = initialState;}void dispatchEvent(LifecycleOwner owner, Event event) {State newState = event.getTargetState();mState = min(mState, newState);mLifecycleObserver.onStateChanged(owner, event);mState = newState;}}
}

该类实现了对观察者的增加和删除、状态的同步以及状态改变后对观察者的状态变化通知。

二、LifecycleObserver(生命周期观察者)

在这里插入图片描述

2.1、LifecycleObserver

package androidx.lifecycle;/*** Marks a class as a LifecycleObserver. Don't use this interface directly. Instead implement either* {@link DefaultLifecycleObserver} or {@link LifecycleEventObserver} to be notified about* lifecycle events.** @see Lifecycle Lifecycle - for samples and usage patterns.*/
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {}

2.2、FullLifecycleObserver

package androidx.lifecycle;interface FullLifecycleObserver extends LifecycleObserver {void onCreate(LifecycleOwner owner);void onStart(LifecycleOwner owner);void onResume(LifecycleOwner owner);void onPause(LifecycleOwner owner);void onStop(LifecycleOwner owner);void onDestroy(LifecycleOwner owner);
}

FullLifecycleObserver定义了所有生命周期的事件,如果我们实现了该接口,就要重写所有的事件方法

2.3、DefaultLifecycleObserver

package androidx.lifecycle;import androidx.annotation.NonNull;@SuppressWarnings("unused")
public interface DefaultLifecycleObserver extends FullLifecycleObserver {@Overridedefault void onCreate(@NonNull LifecycleOwner owner) {}@Overridedefault void onStart(@NonNull LifecycleOwner owner) {}@Overridedefault void onResume(@NonNull LifecycleOwner owner) {}@Overridedefault void onPause(@NonNull LifecycleOwner owner) {}@Overridedefault void onStop(@NonNull LifecycleOwner owner) {}@Overridedefault void onDestroy(@NonNull LifecycleOwner owner) {}
}

FullLifecycleObserver定义了生命周期的所有事件方法,为了不用重写所有的方法,就新增了DefaultLifecycleObserver接口,该接口继承了FullLifecycleObserver,并且重写了所有的事件函数,这样我们在自定义LifecycleObserver的时候可以直接实现DefaultLifecycleObserver重写需要用到的事件函数即可

2.4、LifecycleEventObserver

package androidx.lifecycle;import androidx.annotation.NonNull;public interface LifecycleEventObserver extends LifecycleObserver {void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

如果一个自定义观察者既实现了LifecycleEventObserver接口,也实现了DefaultLifecycleObserver接口,当宿主的生命周期有变化的时候,会优先调用DefaultLifecycleObserver的方法,然后再调用LifecycleEventObserver的onStateChanged方法

2.4.1 示例

package com.anniljing.lifecyclecorestudy;import android.util.Log;import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;public class MyObserver implements DefaultLifecycleObserver, LifecycleEventObserver {private static final String TAG="MyObserver";@Overridepublic void onCreate(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onCreate");}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onStart");}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onResume");}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onStop");}@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {Log.e(TAG,"LifecycleEventObserver onStateChanged:"+event.name());}
}

在这里插入图片描述

三、LifecycleOwner(生命周期宿主)

3.1、源码

@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {/*** Returns the Lifecycle of the provider.** @return The lifecycle of the provider.*/@NonNullLifecycle getLifecycle();
}

为宿主返回一个Lifecycle。

四、Fragment实现

在这里插入图片描述

  • 在Fragment的构造方法里面,创建了LifecycleRegistry
  • 在performCreate里面首先注册了一个LifecycleEventObserver观察者,重写了onStateChanged方法,用来接收Fragment的生命周期的状态,这样就完成了观察者的注册
  • 在performCreate里面调用onCreate方法
  • 后续就是Fragment生命周期变化时,通知LifecycleObserver的过程:Fragment的performXXX()、onXXX()方法;LifecycleRegistry的handleLifecycleEvent()方法;LifecycleObserver的onStateChanged()方法
  • LifecycleRegistry里面通过调用sync方法,通过比较大小的方式,来判断是状态升级,还是状态降级,来调整后面的状态
private void sync() {LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"+ "garbage collected. It is too late to change lifecycle state.");}while (!isSynced()) {mNewEventOccurred = false;//如果下一个状态小于最早的,则说明要降级if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {backwardPass(lifecycleOwner);}Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();//如果下一个状态的值大于最新的,则说明需要升级if (!mNewEventOccurred && newest != null&& mState.compareTo(newest.getValue().mState) > 0) {forwardPass(lifecycleOwner);}}mNewEventOccurred = false;}

五、Activity的实现

onCreate()

protected void onCreate(@Nullable Bundle savedInstanceState) {// Restore the Saved State first so that it is available to// OnContextAvailableListener instancesmSavedStateRegistryController.performRestore(savedInstanceState);mContextAwareHelper.dispatchOnContextAvailable(this);super.onCreate(savedInstanceState);ReportFragment.injectIfNeededIn(this);if (BuildCompat.isAtLeastT()) {mOnBackPressedDispatcher.setOnBackInvokedDispatcher(Api33Impl.getOnBackInvokedDispatcher(this));}if (mContentLayoutId != 0) {setContentView(mContentLayoutId);}}

ReportFragment.injectIfNeededIn()

public static void injectIfNeededIn(Activity activity) {if (Build.VERSION.SDK_INT >= 29) {// On API 29+, we can register for the correct Lifecycle callbacks directlyLifecycleCallbacks.registerIn(activity);}// Prior to API 29 and to maintain compatibility with older versions of// ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and// need to support activities that don't extend from FragmentActivity from support lib),// use a framework fragment to get the correct timing of Lifecycle eventsandroid.app.FragmentManager manager = activity.getFragmentManager();if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();// Hopefully, we are the first to make a transaction.manager.executePendingTransactions();}}

Activity源码中,把宿主的生命周期的感知放到了ReportFragment里面,Fragment是依附在activity的,能够同步到Activity的生命周期的事件。

六、示例

6.1、MyObserver

package com.anniljing.lifecyclecorestudy;import android.util.Log;import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;public class MyObserver implements DefaultLifecycleObserver, LifecycleEventObserver {private static final String TAG="MyObserver";@Overridepublic void onCreate(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onCreate");}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onStart");}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onResume");}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {Log.e(TAG,"DefaultLifecycleObserver onStop");}@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {Log.e(TAG,"LifecycleEventObserver onStateChanged:"+event.name());}
}

6.2、LifecycleMainActivity

package com.anniljing.lifecyclecorestudy;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class LifecycleMainActivity extends AppCompatActivity {private MyObserver mObserver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mObserver = new MyObserver();getLifecycle().addObserver(mObserver);}
}

在这里插入图片描述
自定义的MyObserver 实现了DefaultLifecycleObserver,同时也实现了LifecycleEventObserver,从打印结果验证了如果既实现了DefaultLifecycleObserver,也实现了LifecycleEventObserver,会优先调用DefaultLifecycleObserver的事件回调,后面才调用LifecycleEventObserver的onStateChanged

相关文章:

Jetpack之Lifecycle应用与源码分析

Build lifecycle-aware components that can adjust behavior based on the current lifecycle state of an activity or fragment. 上面是源于官网的定义&#xff0c;简单翻译就是说Lifecycle的作用就是基于当前的Activity或者Fragment的生命周期当前状态构建可感知生命周期的…...

Python序列类型之集合

&#x1f490;&#x1f490;&#x1f490;欢迎来到小十一的博客&#xff01;&#xff01;&#xff01; &#x1f3af;博客主页&#xff1a;&#x1f3af;程序员小十一的博客 &#x1f680;博客专栏&#xff1a;&#x1f680;Python入门基础语法 &#x1f337;欢迎关注&#xff…...

java 自定义json解析注解 复杂json解析

java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…...

Vue3配置路由(vue-router)

文章目录前言一、配置路由&#xff08;vue-router&#xff09;1、安装路由2、新建页面3、创建路由配置文件4.特殊报错&#xff01;前言 紧接上篇文章&#xff0c;vue3的配置与vue2是有所差别的&#xff0c;本文就讲述了如何配置&#xff0c;如果本文对你有所帮助请三连支持博主…...

【代码随想录二刷】Day9-字符串-C++

代码随想录二刷Day9 今日任务 28.找出字符串中第一个匹配项的下标 459.重复的子字符串 字符串总结 双指针总结 语言&#xff1a;C KMP 链接&#xff1a;https://programmercarl.com/0459.重复的子字符串.html#kmp 用处&#xff1a;当出现字符串不匹配时&#xff0c;可以利…...

google colab上如何下载bert相关模型

首先要知道模型的地址 tensorflow版本的模型&#xff1a; https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip pytorch版本的模型 ‘bert-base-cased’: …...

Vue2.0页面缓存机制联合页面标签的交互(keep-alive + router)

预期效果&#xff1a;&#xff08;借助iview-ui的在线体验页面示意一下&#xff09; 项目中只有一部分页面需要缓存&#xff0c;且存在多级路由的页面。每打开一个菜单&#xff0c;就会新增一个 Tab标签&#xff0c;只要 Tab标签不关闭&#xff0c;对应的页面就会被缓存&#x…...

C++STL剖析(四)—— stack和queue的概念和使用

文章目录1. stack的介绍2. stack的构造3. stack的使用&#x1f351; push&#x1f351; top&#x1f351; pop&#x1f351; empty&#x1f351; size&#x1f351; swap&#x1f351; emplace4. queue的介绍5. queue的构造6. queue的使用&#x1f351; push&#x1f351; size…...

流浪地球 | 建筑人是如何看待小破球里的黑科技的?

大家好&#xff0c;这里是建模助手。 想问问大家今年贺岁档&#xff0c;都跟上没有&#xff0c;今天请允许我蹭一下热点表达一下作为一个科幻迷的爱国之情。 抛开大刘的想象力、各种硬核科技&以及大国情怀不提&#xff0c;破球2中的传承还是让小编很受感动&#xff0c;无…...

软中断在bottom-half中调用

https://www.bilibili.com/read/cv20785285/简介软中断可以在两个位置得到机会执行&#xff1a;硬中断返回前 irq_exit中断下半部 Bottom-half Enable后情景分析情景1spin_unlock_bh__raw_spin_unlock_bh__local_bh_enable_ip 打开Bottom-half&#xff0c;并让softirq有机会…...

GEE遥感云大数据在林业中的应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…...

Apollo架构篇 - 客户端架构

前言 本文基于 Apollo 1.8.0 版本展开分析。 客户端 使用 Apollo 支持 API 方式和 Spring 整合两种方式。 API 方式 API 方式是最简单、高效使用使用 Apollo 配置的方式&#xff0c;不依赖 Spring 框架即可使用。 获取命名空间的配置 // 1、获取默认的命名空间的配置 C…...

JVM调优最全面的成长 :参数详解+垃圾算法+示例展示+类文件到源码+面试问题

目录1.优秀的Java开发者1.1 什么是Java&#xff1f;1.2 编程语言1.3 计算机[硬件]能够懂的语言1.3.1 计算机发展史1.3.2 计算机体系结构1.3.3 计算机处理数据过程1.3.4 机器语言1.3.5 不同厂商的CPU1.3.6 操作系统1.3.7 汇编语言1.3.8 高级语言1.3.9 编译型和解释型1.3.9.1 编译…...

linux驱动常用函数

以下为一些常见用户态函数在内核中的替代&#xff0c;包括头文件和函数声明&#xff1a;1、动态申请内存&#xff1a;linux/vmalloc.hvoid *vmalloc(unsigned long size);void vfree(const void *addr);2、字符串操作&#xff1a;linux/string.hvoid * memset(void *,int,__ker…...

Flowable进阶学习(九)数据对象DataObject、租户Tenant、接收任务ReceiveTask

文章目录一、数据对象DataObject二、租户 Tenant三、接收任务 ReceiveTask案例一、数据对象DataObject DataObject可以⽤来定义⼀些流程的全局属性。 绘制流程图&#xff0c;并配置数据对象&#xff08;不需要选择任意节点&#xff09; 2. 编码与测试 /*** 部署流程*/ Test…...

C语言实现五子棋(n子棋)

五子棋的历史背景&#xff1a; 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。五子棋容易上手&#xff0c…...

OpenStack云平台搭建(2) | 安装Keystone

目录 1、登录数据库配置 2、数据库导入Keystone表 3、配置http服务 4、创建域、用户 5、创建脚本 Keystone&#xff08;OpenStack Identity Service&#xff09;是 OpenStack 框架中负责管理身份验证、服务访问规则和服务令牌功能的组件。下面我们进行Keystone的安装部署 1…...

基于javaFX的固定资产管理系统

1. 总体设计 本系统分为登录模块、资产管理模块、资产登记模块和信息展示模块共四个模块。 登录模块的主要功能是&#xff1a;管理员通过登录模块登录本系统&#xff1b; 资产管理模块的主要功能有&#xff1a;修改、删除系统中的固定资产&#xff1b; 在资产登记模块中&#…...

板子登录和挂载问题记录

ubuntu登录板子问题 ssh登录ssh 10.1.3.15&#xff0c;显示No route to host 则尝试在板子上ping 本机ip 试一下 挂载 本地机器vim /etc/export编辑此内容并保存 /exports_0209/tda4_build *(rw,no_root_squash,nohide,insecure,no_subtree_check,async)1.挂载nfs方法 mou…...

二、Linux文件 - Open函数讲解实战

目录 1.Open函数讲解 2.open函数实战 2.1 man 1 ls 查询Shell命令 2.2 man 2 open 查看系统调用函数 2.3项目实战 2.3.1O_RDWR和O_CREAT 2.3.2O_APPEND的用法 1.Open函数讲解 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xf…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...