Android WorkManager的概念和使用

1. WorkManager基礎與核心概念

1.1 WorkManager概述

WorkManager是Android Jetpack架構組件庫的核心成員,專為管理可靠的后臺任務而設計。它提供了一套統一的API,用于調度需保障執行的延遲型異步任務(如數據同步、日志上傳),確保任務在應用退出甚至設備重啟后仍能完成。作為Android平臺推薦的后臺任務調度框架,WorkManager平衡了系統資源限制與任務執行可靠性,成為替代傳統方案(如AlarmManager、JobScheduler)的現代化解決方案。

1.2 核心設計目標

  • 有保證的執行(Guaranteed Execution):通過SQLite數據庫持久化任務信息,即使應用進程被終止或設備重啟,系統也會在滿足條件后重新調度任務。
  • 機會性執行(Opportunistic Execution):在設備資源充足時(如充電狀態、空閑時段)立即執行任務,優化電池壽命與用戶體驗。
  • 跨版本兼容性:自動適配底層調度機制:
    • API ≥23:使用JobScheduler
    • API 14-22:降級為AlarmManager + BroadcastReceiver

1.3 核心優勢

  • 簡化多線程管理:自動處理線程調度,開發者只需關注Worker中的業務邏輯。
  • 靈活的任務鏈:支持順序或并行任務組合,例如“下載→處理→上傳”工作流可通過beginWith().then()鏈式調用實現。
  • 智能約束系統:通過Constraints.Builder設置執行條件(如僅WiFi下執行),避免無效喚醒。

1.4 典型適用場景

  • 關鍵數據操作:用戶數據同步、數據庫備份(需保障執行)。
  • 資源敏感型任務:大文件上傳(需UNMETERED網絡約束)、圖片處理(需設備空閑)。
  • 聚合執行場景:日志批量上報(周期性任務 + 彈性窗口flexInterval)。

?? 注意:WorkManager 不適用于實時性要求高的任務(如即時通訊),此類場景需改用前臺服務或推送機制。其核心價值在于為可延遲但必須完成的任務提供標準化、低能耗的調度框架。

2. 基礎使用?

2.1 ?添加依賴

在 build.gradle中添加依賴

dependencies {implementation "androidx.work:work-runtime-ktx:2.9.1" // KTX 擴展支持協程
}

2.2 創建 Worker 類?

繼承 CoroutineWorker(推薦協程)或 Worker,重寫 doWork()執行任務邏輯

class UploadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {override suspend fun doWork(): Result {val url = inputData.getString("KEY_URL") ?: return Result.failure()try {performUpload(url) // 執行耗時操作return Result.success(workDataOf("RESULT" to "Success"))} catch (e: Exception) {return Result.retry() // 失敗時重試}}
}?

2.3 配置 WorkRequest?

??一次性任務??(OneTimeWorkRequest)

val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED) // 需聯網.setRequiresCharging(true) // 需充電.build()val uploadRequest = OneTimeWorkRequestBuilder<UploadWorker>().setInputData(workDataOf("KEY_URL" to "https://example.com")).setConstraints(constraints).setInitialDelay(10, TimeUnit.MINUTES) // 延遲啟動.build()

周期性任務??(PeriodicWorkRequest,??最小間隔 15 分鐘??)

val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(15, TimeUnit.MINUTES).build()

2.4 提交任務??

通過 WorkManager實例入隊任務

WorkManager.getInstance(context).enqueue(uploadRequest)

3. Constraints有哪些方法 ?

以下方法都是 Constraints.Builder 類中的核心方法,用于為 WorkManager 的后臺任務 (WorkRequest) 設置精確的執行條件

這些方法可以分為幾大類:設備狀態約束網絡約束內容URI觸發約束

3.1 設備狀態約束 (Device State Constraints)

這類方法確保任務只在設備處于特定狀態下才執行,對省電和用戶體驗至關重要。

3.1.1 setRequiresCharging(requiresCharging: Boolean): Builder
  • 作用:設置任務是否必須在設備充電時才能運行。
  • 參數requiresCharging - 設為 true 表示必須充電。
  • 默認值false(不要求充電)。
  • 使用場景:非常適合執行耗電量巨大的任務,例如大規模數據同步、備份或復雜的文件處理,可以避免在用戶使用電池時消耗其電量。
3.1.2 setRequiresDeviceIdle(requiresDeviceIdle: Boolean): Builder
  • 作用:設置任務是否必須在設備空閑時才能運行。設備空閑通常指屏幕關閉一段時間且沒有用戶交互。
  • 參數requiresDeviceIdle - 設為 true 表示必須設備空閑。
  • 默認值false(不要求空閑)。
  • API 要求:需要 Android 6.0 (API 級別 23) 或更高。
  • 使用場景:用于執行非常占用 CPU 或網絡資源的密集型任務,確保不會在用戶 actively 使用設備時造成卡頓或干擾。

系統判定設備空閑需滿足以下條件:

  • ??屏幕關閉??:設備未處于亮屏狀態。
  • ??無用戶交互??:用戶未操作設備(如觸摸、按鍵)持續 ??≥30分鐘??。
  • ??無活躍進程??:無前臺應用或高優先級服務占用資源。
3.1.3 setRequiresBatteryNotLow(requiresBatteryNotLow: Boolean): Builder
  • 作用:設置任務是否必須在設備電量充足時才能運行。系統定義的“低電量”閾值通常約為 15%。
  • 參數requiresBatteryNotLow - 設為 true 表示必須電量充足。
  • 默認值false(不要求電量充足)。
  • 使用場景:用于非緊急的后臺任務,避免在用戶電量緊張時雪上加霜。可以和高優先度的通知任務結合,低電量時暫停普通同步。
3.1.4 setRequiresStorageNotLow(requiresStorageNotLow: Boolean): Builder
  • 作用:設置任務是否必須在設備存儲空間充足時才能運行。避免在存儲空間即將耗盡時執行可能寫入文件的操作。
  • 參數requiresStorageNotLow - 設為 true 表示必須存儲空間充足。
  • 默認值false(不要求存儲空間充足)。
  • 使用場景:任何需要下載文件或緩存數據的任務,如下載更新、保存圖片或日志文件等。

3.2 網絡約束 (Network Constraints)

這類方法控制任務執行所需的網絡環境。

3.2.1 setRequiredNetworkType(networkType: NetworkType): Builder
  • 作用:設置任務執行所需的基本網絡類型。這是最常用的網絡約束方法。
  • 參數networkType - 枚舉值,包括:
    • NOT_REQUIRED:不需要網絡(默認值)。
    • CONNECTED:設備有任何網絡連接即可(Wi-Fi 或移動數據)。
    • UNMETERED:需要不計流量的網絡(如 Wi-Fi)。
    • METERED:需要按流量計費的網絡(如移動數據)。
    • NOT_ROAMING:需要非漫游網絡。
  • 使用場景
    • UNMETERED:用于下載大文件、更新應用、上傳日志等大量數據傳輸操作。
    • CONNECTED:用于輕量級的網絡請求,如發送即時消息、獲取小型配置更新等。
    • METERED:用于需要明確使用移動數據的場景。
3.2.2 setRequiredNetworkRequest(networkRequest: NetworkRequest, networkType: NetworkType): Builder
  • 作用:提供一個更高級、更精細的網絡約束方式(基于 Android 的 NetworkRequest API)。它允許你指定更復雜的網絡能力要求,例如帶寬、延遲等。在較新的 Android 版本(API 28+)上使用此設置,在舊版本上會自動回退到您指定的 networkType
  • 限制:不支持設置了 NetworkSpecifier(如指定特定 Wi-Fi SSID)或 setIncludeOtherUidNetworks 的請求,傳入此類請求會拋出 IllegalArgumentException
  • API 要求:需要 Android 5.0 (API 級別 21) 或更高,但其高級功能在更高版本上才有效。
  • 使用場景:需要非常特定網絡條件的專業應用,例如視頻會議應用需要高上行帶寬的網絡,或游戲需要低延遲網絡。

3.3 內容URI觸發約束 (Content URI Triggers)

這是一組非常強大的約束,允許任務在你關注的特定數據發生變化時被觸發,類似于數據庫的觸發器。

3.3.1 addContentUriTrigger(uri: Uri, triggerForDescendants: Boolean): Builder
  • 作用:添加一個要監聽的內容提供者 (ContentProvider) 的 URI。當此 URI 代表的數據發生變化(插入、更新、刪除)時,會觸發任務運行。
  • 參數
    • uri:要監聽的內容 URI(例如 content://media/external/images/media)。
    • triggerForDescendants:如果為 true,則監聽該 URI 及其所有子路徑的變化;如果為 false,則只監聽該精確 URI。
  • API 要求:需要 Android 7.0 (API 級別 24) 或更高。
  • 使用場景
    • 監聽媒體庫的變化,當有新圖片或視頻時執行某些處理。
    • 監聽自定義 ContentProvider 的數據變化,實現數據驅動型的任務調度。
3.3.2 setTriggerContentUpdateDelay(…) 與 setTriggerContentMaxDelay(…)
  • 作用:這兩個方法用于控制觸發延遲,以避免在數據頻繁變化時任務被過于頻繁地觸發。
    • setTriggerContentUpdateDelay:設置從檢測到內容變化調度任務之間的最小等待時間。如果在此期間內容再次變化,計時器會重置。
    • setTriggerContentMaxDelay:設置從第一次檢測到內容變化調度任務之間的最大等待時間。即使內容一直在變化,超過此時間后任務也一定會被調度。
  • 重載方法:兩者都提供了接受 (Long, TimeUnit)(Duration) 參數的方法,后者是更現代的 Java Time API。
  • API 要求:需要 Android 7.0 (API 級別 24) 或更高。
  • 使用場景:例如,一個文檔管理應用在用戶批量刪除文件時,文件變化事件會連續觸發。設置一個最大延遲(如 1 分鐘),可以確保任務最終會執行一次以處理所有更改,而不是為每個文件的刪除都執行一次。

4. CoroutineWorker和Worker的區別

CoroutineWorkerWorker 是兩種核心的任務執行基類,它們的設計目標、實現機制和適用場景存在顯著差異。

4.11 基礎架構與線程模型

  • Worker
    基于 Java 的線程池和回調機制。其 doWork() 方法在后臺線程中同步執行,需避免阻塞主線程。若任務耗時較長,可能占用線程池資源,影響其他任務調度。
  • CoroutineWorker
    基于 Kotlin 協程實現。doWork() 是掛起函數(suspend),在協程作用域內異步執行。任務可被掛起(如等待 I/O 操作),釋放底層線程供其他任務使用,顯著提升資源利用率。

4.2 資源消耗與并發能力

  • Worker
    每個任務獨占一個線程,大量并發任務時需創建多個線程,消耗較多內存(每個線程約 1MB 棧空間)。線程切換開銷在高并發場景下可能成為瓶頸。
  • CoroutineWorker
    協程輕量級(內存占用約數十 KB),單線程可調度數萬協程。適合高并發 I/O 操作(如網絡請求、數據庫讀寫),避免線程資源浪費。

4.3 CoroutineWorker和Worker的doWork方法中,需要單獨啟動一個IO線程再執行嗎 ?

4.3.1 ??Worker(傳統 Java 線程模型)?

無需額外啟動 IO 線程??:

Worker.doWork()??默認在 WorkManager 管理的后臺線程池中執行??(非主線程)。該線程池由 Executor實現,默認大小為 2-4 個線程(基于設備 CPU 核心數)

class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {override fun doWork(): Result {// 直接執行同步 I/O 操作(已在后臺線程)val data = downloadFileSync("https://example.com/data")return Result.success()}
}
4.3.2 ??CoroutineWorker(協程模型)?

??無需額外啟動線程,但需指定調度器??:

CoroutineWorker.doWork()是掛起函數,??默認運行在 Dispatchers.Default??(計算密集型線程池)。若需 I/O 操作(如網絡請求、文件讀寫),應使用 withContext(Dispatchers.IO)切換到 I/O 調度器。

class MyCoroutineWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {override suspend fun doWork(): Result {// 切換到 IO 調度器執行阻塞操作val data = withContext(Dispatchers.IO) { downloadFile("https://example.com/data")}return Result.success()}
}

從技術趨勢看,CoroutineWorker 代表了 Android 異步任務的未來方向,尤其在資源利用率和代碼可維護性上優勢明顯。

5. PeriodicWorkRequestBuilder和OneTimeWorkRequestBuilder的區別

PeriodicWorkRequestBuilderOneTimeWorkRequestBuilder 是定義后臺任務的兩類核心構建器,它們的主要區別在于任務執行模式的設計目標。以下是二者的詳細對比及 WorkManager 中的其他構建器類型說明:


5.1 核心區別:執行模式

特性OneTimeWorkRequestBuilderPeriodicWorkRequestBuilder
任務類型一次性任務(執行后終止)周期性任務(按固定間隔重復執行)
最小執行間隔無限制≥15分鐘(受系統強制限制)
適用場景單次數據上傳、即時操作處理定期數據同步、日志備份、周期檢查
靈活性支持復雜約束鏈(如任務鏈 beginWith().then()僅支持獨立任務(不可鏈式調用)
延遲配置支持精確延遲(如 setInitialDelay(10, MINUTES)僅支持重復間隔(repeatInterval)和彈性窗口(flexInterval

?? 周期性任務注意事項

  • 若周期任務執行時約束未滿足(如無網絡),系統會跳過本次執行,不會自動補償,需等待下一周期。
  • 彈性窗口(flexInterval)允許任務在周期末尾的彈性時段內執行(如最后15分鐘),優化資源調度。

5.2 高級配置差異

  1. 重試策略

    • OneTimeWorkRequestBuilder:可通過 setBackoffCriteria() 配置指數退避策略(如失敗后延遲重試)。
    • PeriodicWorkRequestBuilder不支持重試策略,失敗后需等待下一周期。
  2. 加速任務(Expedited Work)

    • OneTimeWorkRequestBuilder 支持 setExpedited(),用于緊急任務(如支付操作),系統會優先分配資源。
    • 周期性任務無法加速執行。

5.3 OneTimeWorkRequestBuilder怎么使用

val constraints = Constraints.Builder().build()val workRequest = OneTimeWorkRequestBuilder<MyWorker>().setConstraints(constraints).setInitialDelay(15, TimeUnit.MINUTES) //任務延遲啟動(例如 15 分鐘后).setBackoffCriteria( //配置失敗后的指數退避重試BackoffPolicy.EXPONENTIAL, // 或 LINEAROneTimeWorkRequest.MIN_BACKOFF_MILLIS, // 最小延遲 10 秒TimeUnit.MILLISECONDS).setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) //加急任務.build()
5.3.1 setBackoffCriteria中EXPONENTIAL和LINEAR的區別

??EXPONENTIAL(指數退避)?? 和 ??LINEAR(線性退避)?? 是兩種不同的重試延遲策略,用于控制任務失敗后重新調度的等待時間增長方式。

  • LINEAR? : ?延遲時間按??固定值線性增加??:延遲時間 = 初始延遲 × 重試次數
  • EXPONENTIAL : 延遲時間按??指數倍數增長 : 延遲時間 = 初始延遲 × 2^(重試次數-1)
5.3.2 setExpedited
  • RUN_AS_NON_EXPEDITED_WORK_REQUEST
    • 配額足夠時??:
      • 任務作為加急任務??立即執行??,享受高優先級調度(低延遲、抗省電限制)。
    • ??配額不足時??:
      • 任務??自動降級為普通后臺任務??,按標準 WorkRequest流程執行:
      • 需等待約束條件滿足(如聯網、充電)。
      • 可能延遲執行(無加急優先級)
  • DROP_WORK_REQUEST??
    • 配合足夠時 :
      • 任務作為加急任務??立即執行??,享受高優先級調度(低延遲、抗省電限制)。
    • 配額不足時??直接丟棄任務??,不會轉為普通任務

加急任務(RUN_AS_NON_EXPEDITED_WORK_REQUEST)的優先級高于延遲設置??(setInitialDelay)
加急任務會嘗試??立即執行??,僅受系統配額限制(如設備資源緊張時可能延遲)
若當前配額充足(如應用在前臺或系統負載低),加急任務會忽略延遲時間直接啟動

6. WorkManager怎么取消任務

取消任務需根據任務標識類型選擇對應方法

6.1 通過任務 ID 取消

每個 WorkRequest 創建時自動生成唯一 ID (UUID),適用于精確取消單個任務。

val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()
WorkManager.getInstance(context).enqueue(workRequest)// 取消任務
WorkManager.getInstance(context).cancelWorkById(workRequest.id)

適用場景:明確知道目標任務的 ID 時使用。

6.2 通過標簽 (Tag) 取消

為任務添加標簽后,可批量取消同標簽的所有任務:

val workRequest = OneTimeWorkRequestBuilder<MyWorker>().addTag("data_sync") // 添加標簽.build()// 取消所有帶此標簽的任務
WorkManager.getInstance(context).cancelAllWorkByTag("data_sync")

優勢:適用于邏輯分組任務(如“所有數據同步任務”)。


6.3 取消唯一任務 (Unique Work)

唯一任務通過名稱 (uniqueWorkName) 標識,同一名稱僅允許一個實例運行:

val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()// 提交唯一任務
WorkManager.getInstance(context).enqueueUniqueWork("unique_sync_task", ExistingWorkPolicy.REPLACE, workRequest
)// 通過唯一名稱取消
WorkManager.getInstance(context).cancelUniqueWork("unique_sync_task")

策略說明

  • ExistingWorkPolicy.REPLACE:新任務自動取消舊任務。
  • 適用于防重復任務(如定時數據同步)。

6.4 取消所有任務

清理整個 WorkManager 隊列:

WorkManager.getInstance(context).cancelAllWork()

慎用:會取消所有未完成的任務(包括周期任務)。


6.5 取消后的任務行為

  • 狀態變更:任務狀態變為 CANCELLED,但 doWork() 中的代碼不會立即停止
  • 資源釋放:需在 Worker 中主動檢查取消信號:
    class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {override fun doWork(): Result {while (!isStopped) { // 循環中檢查取消狀態// 執行邏輯}return Result.success()}override fun onStopped() {super.onStopped()// 釋放資源(如關閉數據庫連接)}
    }
    
    關鍵點
    • isStopped:檢測任務是否被取消。
    • onStopped():收到取消信號時回調,用于清理資源。
6.5.1 通過workManager.getWorkInfosByTag,怎么判斷是否有某個Work還未執行 ?
val workManager = WorkManager.getInstance(context)
val tag = "YOUR_TAG" // 替換為實際標簽// 異步監聽方式(推薦)
workManager.getWorkInfosByTagLiveData(tag).observe(this) { workInfos ->val hasUnfinishedWork = workInfos.any { workInfo ->workInfo.state == WorkInfo.State.ENQUEUED || workInfo.state == WorkInfo.State.BLOCKED}if (hasUnfinishedWork) {Log.d("WorkStatus", "存在未執行的任務")}
}// 同步查詢方式(需在后臺線程執行)
val workInfos = workManager.getWorkInfosByTag(tag).get()
val unfinishedWorkExists = workInfos.any { workInfo ->workInfo.state == WorkInfo.State.ENQUEUED || workInfo.state == WorkInfo.State.BLOCKED
}

6. 更多內容

有關Doze低功耗模式下的WorkManager,詳見 : Android Doze低電耗休眠模式 與 WorkManager

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96832.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

容器使用卷

1.創建一個卷并讓容器掛載該卷1.創建一個卷[roothost1 ~]# docker volume create test-vol test-vol2.列出本地 Docker 主機上的卷[roothost1 ~]# docker volume ls DRIVER VOLUME NAME local test-vol3.查看該卷的詳細信息[roothost1 ~]# docker volume inspect test-v…

高數基礎知識(下)②

文章目錄七、微分方程7.3 高階線性微分方程7.3.1 線性微分方程的解的結構7.3.2 常系數齊次線性微分方程7.3.3 常系數非齊次線性微分方程八、多元函數微分學8.1 偏導數8.2 全微分8.3 基本定理8.4 復合函數微分法8.5 隱函數微分法8.6 多元函數的極值8.6.1 無條件極值8.6.2 條件極…

從0°到180°,STM32玩轉MG996R舵機

1.MG996R舵機的性能參數參數數值產品型號MG995/MG996R產品重量55 g工作扭矩13 kgcm反應速度53-62 R/M使用溫度-30C ~ 55C死區設置4 微秒插頭類型JR、FUTABA 通用轉動角度180&#xff08;左90&#xff0c;右90&#xff09;舵機類型數碼舵機使用電壓3.0 - 7.2 V工作電流100 mA結構…

[frontend]mermaid code2image

hello everyone, welcome to my bolg, here i will introduce something interesting, and if you are interested it, please just let me know. follow me and send me a message are both avaiable. what is mermaid? Mermaid 是一個工具&#xff0c;它能讓你用簡單的文字代…

Jakarta EE 在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導(附完整代碼)

Jakarta EE 在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導(附完整代碼) 摘要:實驗基于Jakarta EE 9+(兼容Tomcat 10+)、Maven作為構建工具,并在IntelliJ IDEA 2023.2(Community版免費)中進行。項目使用Maven Archetype WebApp模板生成基礎結構,然后升級到J…

JavaScript經典面試題一(JavaScript基礎)

目錄 一、JavaScript中的變量提升 1. 機制 2. 示例 3. 注意事項 4. 總結 二、var、let和const的區別。 1. 作用域&#xff08;Scope&#xff09; 2. 變量提升&#xff08;Hoisting&#xff09; 3. 重新賦值和重新聲明 4. 示例 示例1&#xff1a;作用域和塊級行為 示…

數據庫造神計劃第七天---增刪改查(CRUD)(3)

&#x1f525;個人主頁&#xff1a;尋星探路 &#x1f3ac;作者簡介&#xff1a;Java研發方向學習者 &#x1f4d6;個人專欄&#xff1a;《從青銅到王者&#xff0c;就差這講數據結構&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此簡單&a…

AWS SQS 可觀測性最佳實踐

AWS SQS AWS SQS&#xff08;Amazon Simple Queue Service&#xff09;是一種完全托管的消息隊列服務&#xff0c;用于在分布式系統中解耦和緩沖消息。它支持高可用性、可擴展性和安全性&#xff0c;能夠處理大量消息&#xff0c;確保消息的可靠傳輸和順序性。開發者可以輕松集…

AI推理范式:從CoT到ReAct再到ToT的進化之路

在人工智能領域&#xff0c;如何讓模型像人類一樣進行復雜推理和問題解決&#xff0c;一直是核心挑戰。近年來&#xff0c;思維鏈&#xff08;Chain-of-Thought, CoT&#xff09;、推理與行動&#xff08;ReAct&#xff09; 和 思維樹&#xff08;Tree-of-Thoughts, ToT&#x…

2025時序數據庫選型:深入解析IoTDB從主從架構基因到AI賦能的創新之路

原創經驗總結,拒絕空談,用數據和實戰說話 時序數據時代的"四重考驗" 在智慧工廠、新能源車、金融市場等場景中,每秒百萬級的數據點如潮水般涌來。這些時序數據背后隱藏著四大核心挑戰:極高的寫入并發、強時間關聯性查詢、海量數據生命周期管理,以及亂序與高基…

深入淺出LVS負載均衡群集:原理、分類與NAT模式實戰部署

深入淺出LVS負載均衡群集&#xff1a;原理、分類與NAT模式實戰部署 文章目錄深入淺出LVS負載均衡群集&#xff1a;原理、分類與NAT模式實戰部署一、企業群集&#xff1a;從單臺服務器到分布式架構的必然選擇1. 什么是群集&#xff1f;2. 為什么需要群集&#xff1f;二、企業群集…

Flash Table實測:JAI賦能低代碼開發,重塑企業級應用構建范式

目錄&#x1f50d; 引言1.1 什么是Flash Table1.2 低代碼平臺的進化與FlashTable的革新?FlashTable背景&#xff1a;為什么需要新一代低代碼平臺&#xff1f;2.1 傳統開發的痛點2.2 低代碼平臺的局限2.3 FlashTable的差異化定位&#x1f4bb; FlashTable安裝&#xff1a;Docke…

SonarQube代碼質量管理平臺本地化搭建和使用

SonarQube 是一個開源的代碼質量管理平臺&#xff0c;主要用于持續檢查代碼質量&#xff0c;支持多種編程語言。 本文章記錄了在windows環境中&#xff0c;搭建和使用SonarQube的完整過程。 ①SonarQube平臺搭建 SonarQube最新社區版本下載地址&#xff1a; https://www.son…

基于雙向LSTM深度學習網絡模型的文本序列推薦系統matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 在信息爆炸的時代&#xff0c;用戶面臨著海量文本信息的篩選難題&#xff0c;文本序列推薦系統應運而生。雙向長短期記憶網絡&#xff08;Bi-directional Long …

Transformer實戰(17)——微調Transformer語言模型進行多標簽文本分類

Transformer實戰(17)——微調Transformer語言模型進行多標簽文本分類 0. 前言 1. 多標簽文本分類 2. 數據加載與處理 3. 模型微調 小結 系列鏈接 0. 前言 與單標簽分類不同,多標簽分類要求模型能夠為同一文本分配多個相關標簽,這在新聞分類、文獻標注、內容推薦等場景中尤…

開源 C++ QT Widget 開發(十六)程序發布

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源…

MATLAB2-結構化編程和自定義函數-臺大郭彥甫視頻

目錄 if elseif else switch case otherwise while exercise練習 for 預宣告 練習題 break tips編程的小技巧 functions函數 練習題 函數句柄 if elseif else 如果condition為真&#xff0c;執行語句 if condition1statement1 elseif condition2statement2 elsest…

LVGL移植2048小游戲全攻略

目錄 準備腳手架 修改源碼 對接觸摸 測試編譯 測試運行 這一節將以一個已經編寫好的 lvgl 小游戲 2048 描述如何將已經編寫完成的 lvgl 程序移植到開發板上。 準備腳手架 在這之前&#xff0c;我們先準備基礎的 LVGL 腳手架。可以直接從 lv_g2d_test 里復制過來進行修改…

在Unity2021中使用Profiler的Deep Profile功能時內存超高怎么辦?

這通常是因為Deep Profile會記錄每一幀所有函數調用的詳細信息&#xff0c;導致內存急劇增長&#xff0c;尤其在大型項目或復雜場景中4。別擔心&#xff0c;我來幫你分析原因并提供一些解決辦法。 理解 Deep Profile 的內存開銷與替代方案 Deep Profile是Unity Profiler的一個…

Ubuntu 設置中文輸入法

一、使用 IBus&#xff08;Ubuntu 默認框架&#xff09;步驟 1&#xff1a;安裝中文輸入法sudo apt install ibus-libpinyin ibus-pinyin步驟 2&#xff1a;添加輸入法打開 Settings > Keyboard > Input Sources。點擊 “”&#xff0c;搜索 Chinese (Intelligent Pinyin…