Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)
对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 MyImgView ,集中围绕正图的缓存是否存在展开加载逻辑。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<activityandroid:colorMode="wideColorGamut"></activity>
implementation("io.coil-kt.coil3:coil:3.1.0")implementation("io.coil-kt.coil3:coil-gif:3.1.0")implementation("io.coil-kt.coil3:coil-core:3.1.0")implementation("io.coil-kt.coil3:coil-video:3.1.0")implementation("io.coil-kt.coil3:coil-svg:3.1.0")
import android.content.ContentUris
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import coil3.ImageLoader
import coil3.memory.MemoryCache
import coil3.request.CachePolicy
import coil3.request.ImageRequest
import com.appdemo.MyImgView.Item
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {companion object {const val THUMB_WIDTH = 100const val THUMB_HEIGHT = 100const val IMAGE_SIZE = 300const val IMAGE = 1const val VIDEO = 2const val ROW_SIZE = 8const val TAG = "fly/MainActivity"const val PRELOAD = false}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val rv = findViewById<RecyclerView>(R.id.rv)val layoutManager = GridLayoutManager(this, ROW_SIZE)layoutManager.orientation = GridLayoutManager.VERTICALrv.layoutManager = layoutManagerval imageLoader = MyCoilManager.INSTANCE.getImageLoader(applicationContext)val adapter = MyAdapter(this, imageLoader)rv.adapter = adapterrv.layoutManager = layoutManagerrv.setItemViewCacheSize(ROW_SIZE * 10)rv.recycledViewPool.setMaxRecycledViews(0, ROW_SIZE * 10)val ctx = thislifecycleScope.launch(Dispatchers.IO) {val imgList = readAllImage(ctx)val videoList = readAllVideo(ctx)Log.d(TAG, "readAllImage size=${imgList.size}")Log.d(TAG, "readAllVideo size=${videoList.size}")val lists = arrayListOf<MyData>()lists.addAll(videoList)lists.addAll(imgList)val total = lists.sizeLog.d(TAG, "总数量=$total")lists.shuffle()lifecycleScope.launch(Dispatchers.Main) {adapter.dataChanged(lists)}if (PRELOAD) {fetchLists(imageLoader, videoList)}}}private suspend fun fetchLists(imageLoader: ImageLoader, lists: ArrayList<MyData>) {val probability = 0.65fval from = 50lists.forEachIndexed { idx, myData ->if (idx > from && (Math.random() <= probability)) {Log.d(TAG, "$idx/${lists.size} preload")preload(imageLoader, myData)delay(10)}}}private suspend fun preload(imageLoader: ImageLoader, myData: MyData) {val imageItem = Item(myData)imageItem.memory = Item.MEM_IMAGEval imageMemoryCacheKey = MemoryCache.Key(imageItem.toString())val imageMemoryCache = MyCoilManager.INSTANCE.getMemoryCache(imageMemoryCacheKey)if (imageMemoryCache == null) {val imageReq = ImageRequest.Builder(this).data(imageItem.data.path).memoryCacheKey(imageMemoryCacheKey).memoryCachePolicy(CachePolicy.WRITE_ONLY).size(IMAGE_SIZE).build()imageLoader.execute(imageReq)}}private fun readAllImage(ctx: Context): ArrayList<MyData> {val photos = ArrayList<MyData>()//读取所有图val cursor = ctx.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null)while (cursor!!.moveToNext()) {//路径val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))val id = cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)val imageUri: Uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getLong(id))//名称//val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))//大小//val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))photos.add(MyData(imageUri, path, IMAGE))}cursor.close()return photos}private fun readAllVideo(context: Context): ArrayList<MyData> {val videos = ArrayList<MyData>()//读取视频Videoval cursor = context.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,null,null,null,null)while (cursor!!.moveToNext()) {//路径val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))val id = cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)val videoUri: Uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getLong(id))//名称//val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME))//大小//val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE))videos.add(MyData(videoUri, path, VIDEO))}cursor.close()return videos}
}
import android.content.Context
import android.graphics.BitmapFactory
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil3.Bitmap
import coil3.ImageLoaderclass MyAdapter : RecyclerView.Adapter<MyAdapter.ImageHolder> {private var mCtx: Context? = nullprivate var mImageLoader: ImageLoader? = nullprivate var mItems = ArrayList<MyData>()private var mScreenWidth = 0private var mPlaceHolderBmp: Bitmap? = nullprivate var mThumbError: Bitmap? = nullprivate var mImageError: Bitmap? = nullcompanion object {const val TAG = "fly/ImageAdapter"}constructor(ctx: Context, il: ImageLoader?) : super() {mCtx = ctxmScreenWidth = mCtx?.resources?.displayMetrics?.widthPixels!!mImageLoader = ilmPlaceHolderBmp = BitmapFactory.decodeResource(mCtx!!.resources, R.mipmap.loading)mThumbError = BitmapFactory.decodeResource(mCtx!!.resources, android.R.drawable.ic_menu_gallery)mImageError = BitmapFactory.decodeResource(mCtx!!.resources, android.R.drawable.stat_sys_warning)}fun dataChanged(items: ArrayList<MyData>) {this.mItems = itemsnotifyDataSetChanged()}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageHolder {val view = MyImgView(mCtx!!, mImageLoader, mScreenWidth, mPlaceHolderBmp, mThumbError, mImageError)return ImageHolder(view)}override fun onBindViewHolder(holder: ImageHolder, position: Int) {holder.image.setData(mItems[position])}override fun getItemCount(): Int {return mItems.size}class ImageHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {var image = itemView as MyImgView}
}
import android.app.Application
import android.util.Log
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.SingletonImageLoaderclass MyApp : Application(), SingletonImageLoader.Factory {companion object {const val TAG = "fly/MyApp"}override fun newImageLoader(context: PlatformContext): ImageLoader {Log.d(TAG, "newImageLoader")return MyCoilManager.INSTANCE.getImageLoader(this)}
}
import android.content.Context
import android.os.Environment
import android.util.Log
import coil3.EventListener
import coil3.ImageLoader
import coil3.bitmapFactoryMaxParallelism
import coil3.decode.Decoder
import coil3.disk.DiskCache
import coil3.disk.directory
import coil3.gif.AnimatedImageDecoder
import coil3.imageDecoderEnabled
import coil3.memory.MemoryCache
import coil3.request.CachePolicy
import coil3.request.ImageRequest
import coil3.request.Options
import coil3.svg.SvgDecoder
import coil3.video.VideoFrameDecoder
import java.io.Fileclass MyCoilManager {companion object {const val TAG = "fly/MyCoilManager"val INSTANCE by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { MyCoilManager() }}private var mImageLoader: ImageLoader? = nullprivate var memoryCacheMaxSize = 0Lprivate val MAX_PARALLELISM = 6fun getImageLoader(ctx: Context): ImageLoader {if (mImageLoader != null) {Log.w(TAG, "ImageLoader已经初始化")return mImageLoader!!}Log.d(TAG, "初始化ImageLoader")//初始化加载器。mImageLoader = ImageLoader.Builder(ctx).imageDecoderEnabled(false) //false 对于一些特殊图,可以正常解码。.memoryCachePolicy(CachePolicy.ENABLED).memoryCache(initMemoryCache()).diskCachePolicy(CachePolicy.ENABLED).diskCache(initDiskCache())// BitmapFactoryDecoder// internal const val DEFAULT_MAX_PARALLELISM = 4.bitmapFactoryMaxParallelism(MAX_PARALLELISM).eventListener(object : EventListener() {override fun decodeStart(request: ImageRequest, decoder: Decoder, options: Options) {//Log.d(TAG, "decodeStart ${request.data}")}}).components {add(MyThumbFetcher.Factory(ctx))add(AnimatedImageDecoder.Factory())add(VideoFrameDecoder.Factory())add(SvgDecoder.Factory())}.build()Log.d(TAG, "memoryCache.maxSize=${mImageLoader!!.memoryCache?.maxSize}")return mImageLoader!!}private fun initMemoryCache(): MemoryCache {//内存缓存。val memoryCache = MemoryCache.Builder().maxSizeBytes(1024 * 1024 * 1024 * 2L) //2GB.build()memoryCacheMaxSize = memoryCache.maxSizereturn memoryCache}private fun initDiskCache(): DiskCache {//磁盘缓存。val diskCacheFolder = Environment.getExternalStorageDirectory()val diskCacheName = "coil_disk_cache"val cacheFolder = File(diskCacheFolder, diskCacheName)if (cacheFolder.exists()) {Log.d(TAG, "${cacheFolder.absolutePath} exists")} else {if (cacheFolder.mkdir()) {Log.d(TAG, "${cacheFolder.absolutePath} create OK")} else {Log.e(TAG, "${cacheFolder.absolutePath} create fail")}}val diskCache = DiskCache.Builder().maxSizeBytes(1024 * 1024 * 1024 * 2L) //2GB.directory(cacheFolder).build()Log.d(TAG, "cache folder = ${diskCache.directory.toFile().absolutePath}")return diskCache}fun getMemoryCache(key: MemoryCache.Key): MemoryCache.Value? {return mImageLoader?.memoryCache?.get(key)}fun memoryCache(): MemoryCache? {return mImageLoader?.memoryCache}fun calMemoryCache(): String {val sz = mImageLoader?.memoryCache?.sizereturn "${sz?.toFloat()!! / memoryCacheMaxSize.toFloat()},$sz/$memoryCacheMaxSize"}
}
import android.net.Uriopen class MyData {var uri: Uri? = nullvar path: String? = nullvar lastModified = 0Lvar width = 0var height = 0var position = -1var type = -1 //-1未知。1,普通图。2,视频。constructor(uri: Uri?, path: String?, type: Int = -1) {this.uri = urithis.path = paththis.type = type}override fun toString(): String {return "MyData(uri=$uri, path=$path, lastModified=$lastModified, width=$width, height=$height, position=$position, type=$type)"}
}
import android.content.Context
import android.util.Log
import androidx.appcompat.widget.AppCompatImageView
import coil3.Bitmap
import coil3.ImageLoader
import coil3.asImage
import coil3.memory.MemoryCache
import coil3.request.CachePolicy
import coil3.request.Disposable
import coil3.request.ErrorResult
import coil3.request.ImageRequest
import coil3.request.SuccessResult
import coil3.request.bitmapConfig
import coil3.toBitmapclass MyImgView : AppCompatImageView {companion object {const val TAG = "fly/MyImgView"//整数相除,精度损失的平衡因子const val BALANCE_FACTOR = 1}private var mCtx: Context? = nullprivate var mImageLoader: ImageLoader? = nullprivate var mScreenWidth: Int = 0private var mHeight: Int = 0private var mThumbDisposable: Disposable? = nullprivate var mImageDisposable: Disposable? = nullprivate var mPlaceHolderBmp: Bitmap? = nullprivate var mThumbError: Bitmap? = nullprivate var mImageError: Bitmap? = nullconstructor(ctx: Context,il: ImageLoader?,screenWidth: Int,placeHolderBmp: Bitmap?,thumbError: Bitmap?,imageError: Bitmap?) : super(ctx) {mCtx = ctxmImageLoader = ilmScreenWidth = screenWidthmHeight = mScreenWidth / MainActivity.ROW_SIZE + BALANCE_FACTORscaleType = ScaleType.CENTER_CROPmPlaceHolderBmp = placeHolderBmpmThumbError = thumbErrormImageError = imageError}fun setData(mData: MyData) {clear()val imageItem = Item(mData)imageItem.memory = Item.MEM_IMAGEval imageMemoryCacheKey = MemoryCache.Key(imageItem.toString())val imageMemoryCache = MyCoilManager.INSTANCE.getMemoryCache(imageMemoryCacheKey)if (imageMemoryCache != null) {Log.d(TAG, "命中正图缓存 $imageItem 缓存状态=${MyCoilManager.INSTANCE.calMemoryCache()}")setImageBitmap(imageMemoryCache.image.toBitmap())} else {val thumbItem = Item(mData)thumbItem.memory = Item.MEM_THUMBval thumbMemoryCacheKey = MemoryCache.Key(thumbItem.toString())val thumbMemoryCache = MyCoilManager.INSTANCE.getMemoryCache(thumbMemoryCacheKey)var highQuality = falseif (thumbMemoryCache != null) {Log.d(TAG, "命中缩略图缓存 $thumbItem 缓存状态=${MyCoilManager.INSTANCE.calMemoryCache()}")setImageBitmap(thumbMemoryCache.image.toBitmap())} else {setImageBitmap(mPlaceHolderBmp)val thumbReq = ImageRequest.Builder(mCtx!!).data(thumbItem).bitmapConfig(android.graphics.Bitmap.Config.RGB_565).memoryCacheKey(thumbMemoryCacheKey).memoryCachePolicy(CachePolicy.WRITE_ONLY).size(MainActivity.THUMB_WIDTH, MainActivity.THUMB_HEIGHT).listener(object : ImageRequest.Listener {override fun onSuccess(request: ImageRequest, result: SuccessResult) {Log.d(TAG, "缩略图 onSuccess $thumbItem 缓存状态=${MyCoilManager.INSTANCE.calMemoryCache()}")if (!highQuality) {setImageBitmap(result.image.toBitmap())}}override fun onError(request: ImageRequest, result: ErrorResult) {Log.e(TAG, "缩略图 onError $thumbItem")if (!highQuality) {setImageBitmap(mThumbError)MyCoilManager.INSTANCE.memoryCache()?.set(thumbMemoryCacheKey, MemoryCache.Value(mThumbError?.asImage()!!))}}}).build()mThumbDisposable = mImageLoader?.enqueue(thumbReq)}val imageReq = ImageRequest.Builder(mCtx!!).data(if (imageItem.data.type == MainActivity.VIDEO) {imageItem.data.path} else {imageItem.data.uri}).bitmapConfig(android.graphics.Bitmap.Config.ARGB_8888).memoryCacheKey(imageMemoryCacheKey).memoryCachePolicy(CachePolicy.WRITE_ONLY).size(MainActivity.IMAGE_SIZE).listener(object : ImageRequest.Listener {override fun onSuccess(request: ImageRequest, result: SuccessResult) {highQuality = truemThumbDisposable?.dispose()Log.d(TAG, "正图 onSuccess $imageItem 缓存状态=${MyCoilManager.INSTANCE.calMemoryCache()}")setImageBitmap(result.image.toBitmap())}override fun onError(request: ImageRequest, result: ErrorResult) {Log.e(TAG, "正图 onError $imageItem")setImageBitmap(mImageError)//如果正式的缩略图请求失败,后续放弃重复加载(无意义的重复加载),直接写入失败的异常占位图。MyCoilManager.INSTANCE.memoryCache()?.set(imageMemoryCacheKey, MemoryCache.Value(mImageError?.asImage()!!))}}).build()mImageDisposable = mImageLoader?.enqueue(imageReq)}}override fun onDetachedFromWindow() {super.onDetachedFromWindow()//强化clear//clear()}private fun clear() {Log.d(TAG, "clear")mThumbDisposable?.dispose()mImageDisposable?.dispose()}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)setMeasuredDimension(mHeight, mHeight)}class Item(val data: MyData) {companion object {//内存中的标记const val MEM_THUMB = 0const val MEM_IMAGE = 1}var memory = -1override fun toString(): String {return "Item(data=$data, memory=$memory)"}}
}
import android.content.Context
import android.graphics.Bitmap
import android.util.Log
import android.util.Size
import coil3.ImageLoader
import coil3.asImage
import coil3.decode.DataSource
import coil3.fetch.FetchResult
import coil3.fetch.Fetcher
import coil3.fetch.ImageFetchResult
import coil3.request.Options/*** 例如 FileUriFetcher*/
class MyThumbFetcher(private val ctx: Context, private val item: MyImgView.Item, private val options: Options) : Fetcher {companion object {const val TAG = "fly/MyThumbFetcher"}override suspend fun fetch(): FetchResult {var bmp: Bitmap? = nullval t = System.currentTimeMillis()try {bmp = ctx.contentResolver.loadThumbnail(item.data.uri!!, Size(MainActivity.THUMB_WIDTH, MainActivity.THUMB_HEIGHT), null)Log.d(TAG, "loadThumbnail time cost=${System.currentTimeMillis() - t} $item ${MyCoilManager.INSTANCE.calMemoryCache()}")} catch (e: Exception) {Log.e(TAG, "e=$e Item=$item")}return ImageFetchResult(bmp?.asImage()!!,true,dataSource = DataSource.DISK)}class Factory(private val ctx: Context) : Fetcher.Factory<MyImgView.Item> {override fun create(item: MyImgView.Item,options: Options,imageLoader: ImageLoader,): Fetcher {return MyThumbFetcher(ctx, item, options)}}
}
遗留问题,当有大量的视频且是异常视频时候,累积到某个视频解码任务多时候,后面的加载会被阻塞,疑似是Coil 3的总任务数量限制。
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客文章浏览阅读63次。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。2、现在分别使用缩略图内存缓存和正图内存缓存,感觉应该可以合并,只使用一套内存缓存。https://zhangphil.blog.csdn.net/article/details/146981186
相关文章:
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四) 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 …...
01-JVM 内存模型与 GC 原理
JVM 内存模型与 GC 原理解析 本文将从 JVM 内存模型入手,深入剖析各个区域的作用、GC 的运行机制与常见算法,并结合源码与面试思维,带你掌握 JVM 的底层世界。 一、JVM 内存模型(Java Memory Model) JVM 将内存划分为…...
Docker--Docker镜像制作的注意事项
Docker 镜像制作 dockerfiles的指令讲解 链接 CMD和ENTRYPOINT CMD 和 ENTRYPOINT 是 Dockerfile 中用于指定容器启动时运行命令的两个指令。它们在功能上有一些相似之处,但也存在重要区别。 在编辑Dockerfile时,ENTRYPOINT或者CMD命令会自动覆盖之前…...
AI:支持向量机(SVM)
支持向量机(SVM)理论基础详解:从零开始的完全指南 一、SVM的核心思想:直观理解 1.1 什么是分类问题? 想象你在玩一个游戏:桌上有红色和蓝色的球,你需要画一条线把它们分开。这条线就是分类边界。SVM的目标是找到一条最优分界线,使得这条线到最近的红色球和蓝色球的距…...
Vue.js 中 v-if 的使用及其原理
在 Vue.js 的开发过程中,条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段,能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来,我们就深入探讨…...
Vue.js 中 v-show 的使用及其原理
在 Vue.js 的开发过程中,我们常常需要根据不同的条件来控制页面元素的显示与隐藏。v-show指令作为 Vue.js 提供的重要工具之一,为我们实现这一功能提供了便捷的途径。它与v-if指令有些相似,但在使用方法和原理上存在着明显的区别。接下来&…...
docker安装redisSearch
1.背景 Redis Search 是 Redis 官方提供的全文搜索引擎,它为Redis 提供全文搜索、索引和复杂查询功能。它基于内存存储,结合了 Redis 的高性能和倒排索引技术,支持实时搜索、聚合分析、模糊匹配等场景。RedisSearch 适用于需要快速检索结构化或非结构化…...
ADI的BF561双核DSP怎么做开发,我来说一说(六)IDE硬盘设计
作者的话 ADI的双核DSP,最早的一颗是Blackfin系列的BF561,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。 是的你没有看错,就是IDE,那个最老的硬盘,我们当年做过此类设计。 硬件准备 …...
5.数据结构-图
5.数据结构-图 5.1 图的定义和基本术语5.1.1 图的定义5.1.2 图的基本术语 5.2图的存储结构5.2.1邻接矩阵采用邻接矩阵表示法创建无向网邻接表 5.1 图的定义和基本术语 5.1.1 图的定义 图 G由两个集合V和E组成,记为 G ( V , E ) G(V,E) G(V,E),其中V是…...
uni-app使用web-view传参的坑
问题描述 uni-app开发的一个页面,需要点击时跳转到PC端后台的一个详情页,所以需要传参如下: ticketIdticketCodetoken(用于自动登录,校验身份的) 但是吧,如果你明文传token,容易导…...
Android studio打包uniapp插件
一.参考资料与环境准备 原生工程配置需要使用到Android studio和HbuilderX 当前测试的as版本-20240301,下载地址:HbuilderX版本:4.36 二.插件创建流程 1.导入下载的UniPlugin-Hello-AS工程(下载地址见参考资料) 2.生成jks证书…...
SVT-AV1学习-函数selfguided_restoration_fast_internal
一 selfguided_restoration_fast_internal 函数作用 selfguided_restoration_fast_internal是SVT-AV1 编码器中用于自引导恢复Guided Resration SGR 的一个内部函数,通过自引导滤波技术对输入的去燥他图像数据进行处理,生成一个去燥版本的图像࿰…...
双引擎驱动:解密音视频体验的QoS技术底座与QoE感官革命
QoS 定义:QoS(Quality of Service,服务质量)衡量音视频传输技术层面的性能表现,聚焦网络传输和系统处理能力,通过客观指标量化服务质量。核心指标 码率/带宽:数据传输速率上限,直接…...
element-plus选择菜单栏不变色
代码: <template> ... <el-menu-item index"/task/execute"><el-icon><IconMenu /></el-icon><span>验收任务</span> </el-menu-item> <el-menu-item index"/task/change"><el-icon…...
uniapp加载json动画
一、添加canvas画布 <canvas id"lottie_demo" type"2d" style"display: inline-block;width: 148rpx; height: 148rpx;" /> 二、引入依赖和JSON文件 安装依赖 npm install lottie-miniprogram --save import lottie from lottie-mini…...
快递物流展同期举办2025中国智慧物流核心零部件创新论坛
2025中国智慧物流核心零部件创新论坛 会议主题:“AI ”重构智慧物流核心技术生态 会议介绍 随着人工智能、物联网、5G等技术的快速发展,智慧物流已成为全球物流行业转型升级的核心方向。在AI技术的驱动下,物流行业正从传统的“人、车、货”…...
ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,图书馆借阅系统利用计算机网络实现信息化管理,使图书信息、图书借阅、归还的管理发展和服务水平有显著提升。 本文拟…...
在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验
在 Linux 系统中,通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent,并结合手机模式模拟,实现更灵活的浏览体验。 为什么需要自定义 User-Agent?…...
实验一 单管共射极放大电路
这篇文章是即兴写的,也不知道对不对,只有代码哦~~(文章结尾有彩蛋哦~~~) 表1-1实验数据MATLAB代码: clear all; clc % 参数设置 VCC 12; % 电源电压 (V) RB1 45e3; % 偏置电阻 RB1 (Ohms) RB2 15e3; % 偏置电阻 RB2 (Ohms) R…...
10-python面向对象(上)
10-python面向对象【上】 1.面向对象简介2. 类(class)3. 类的定义4. 参数self4.1 属性和方法4.2 self 1.面向对象简介 Python是一门面向对象的编程语言 所谓面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的 面向过程: 面向过程指将我们…...
Java 大视界 -- 基于 Java 的大数据分布式缓存技术在电商高并发场景下的性能优化(181)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Apache Airflow开源程序是一个以编程方式编写、计划和监控工作流程的平台
一、软件介绍 文末提供程序和源码下载 Apache Airflow开源程序是一个以编程方式编写、计划和监控工作流程的平台,当工作流被定义为代码时,它们将变得更加可维护、可版本化、可测试和协作性。使用 Airflow 将工作流创作为任务的有向无环图 (D…...
大数据学习(101)-spark的高可用模式
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
数字内容体验驱动用户参与增效
数字体验驱动参与增长 在数字化竞争日益激烈的市场环境中,数字内容体验已成为撬动用户深度参与的核心杠杆。通过个性化推荐算法与跨渠道分发策略的协同作用,企业能够精准匹配用户兴趣点,将碎片化信息转化为连贯的价值链条。数据显示…...
一文详解OpenGL环境搭建:Ubuntu20.4使用CLion配置OpenGL开发环境
在计算机图形学的广阔领域中,OpenGL作为行业标准的图形库,为开发者提供了强大的工具集来创建从简单的2D图形到复杂的3D世界。然而,对于初学者而言,配置一个合适的开发环境是迈向成功的第一步。本文将详细介绍如何在Ubuntu 20.04.3 LTS操作系统上搭建基于CLion的OpenGL开发环…...
欧拉函数模板
1.欧拉函数模板 - 蓝桥云课 问题描述 这是一道模板题。 首先给出欧拉函数的定义:即 Φ(n) 表示的是小于等于 n 的数中和 n 互质的数的个数。 比如说 Φ(6)2,当 n 是质数的时候,显然有 Φ(n)n−1。 题目大意: 给定 n 个正整数…...
用PointNet++训练自己的数据集(语义分割模型semseg)
(1)训练部件分割(partseg)模型和检测自己点云并将结果保存txt,请看博主上两篇文章 (2)本文背景是将pipe点云上的缺陷和本体检测出来,即1种语义场景(pipe)&…...
Java反射机制深度解析:方法、实战与底层机制
大家好,我是钢板兽! 反射作为Java的特性,它不仅是Spring三大特性Ioc、DI、AOP的基础,而且MyBatis、Jackson序列化、rpc远程调用接口都用到了反射机制。 本文将带你系统性地掌握 Java 反射的使用,通过 JSON 反序列化的…...
查看wifi密码
netsh wlan show profile nameCMCC-Rkt_Wi-Fi5 keyclear CMCC-Rkt_Wi-Fi5是无线网名称...
RPC 发展史
RPC 发展史 RPC(Remote Procedure Call)即远程过程调用,随着微服务的兴起,每个服务都拥有自己的数据库,负责各自的模块,例如 keystone(认证服务)负责用户信息、权限认证的内容&…...
蓝桥杯基础算法-递归
代码简洁,但涉及到的运算,会随着递归层数的增加成指数级增长 路分析:第20行20列位于45度这条线上 这条线上的数字是1 5 13 25 41...两数之差:4 8 12 16 --->每一个都是在前面的基础上4,可以用递归或者循环 public class dem…...
山东大学离散数学第七章习题解析
参考教材:离散数学教程,徐秋亮 / 栾俊峰 / 卢雷 / 王慧 / 赵合计 编著,山东大学计算机科学与技术学院 注:该解析为个人所写,涵盖了 2022-2023-2 学期赵合计老师所布置的所有课本习题;由于学识、认识及经验…...
关于使用python 安装 flask-openapi3扩展,使用docker 环境的完整复盘
在某个时刻 需要运行python 3 flask-openapi3扩展 当前因为服务器为国产化服务器,操作系统版本为麒麟,python 版本为3.7 因为要安装flask-openapi3 包 又因为flask 版本小于2.0 from flask_openapi3 import OpenAPI,Info,Tag目前安装的是 …...
MybatisPlus的一些基本操作
mybatisplus分页 Testvoid testpage(){IPage<User> page new Page<>(1,3); userDao.selectPage(page,null);System.out.println("当前页码值:"page.getCurrent());System.out.println("每页显示数:"page.getSize());S…...
debian12安装mysql5.7.42(deb)
安装 官方文档 https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/linux-installation-debian.html 上面是8.0的教程,服了我说怎么那么奇怪 5.7官方教程 https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-debian.html …...
基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南
基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南 一、背景与价值 在流计算生产环境中,Flink on YARN的部署方式凭借其资源管理优势被广泛采用。Savepoint作为Flink任务状态的一致性快照,承载着故障恢复、版本升级、作业暂停等重要场景…...
Winform入门进阶企业级开发示例:http接口数据清洗转换、断线续传、mqtt数据传输实例详解(附代码资源下载)
场景 C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: C#/Winform入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享_winform 强化学习-CSDN博客 如何将以上相关理论知识学以致用。下面针对Winform…...
PHP开发效率提升利器:通义灵码在VSCode中的应用与技巧
引言 在 PHP 开发领域,提高编码效率和质量是每位开发者追求的目标。通义灵码,作为一款由阿里云技术团队开发的智能编码助手,能够通过其强大的 AI 能力,为 PHP 开发者提供包括代码自动补全、智能注释、代码优化等多方面的支持。本…...
WHAT - React 错误边界处理 - react-error-boundary
目录 安装使用方式常用 Props使用场景 react-error-boundary 是一个由 Brian Vaughn 开发的 React 组件库,用于更方便地处理组件树中的错误(错误边界)。 阅读参考: React Error Boundariesreact-error-boundary 安装 npm inst…...
数据模型评估的四维黄金法则:从技术验证到业务价值证明
引言:为什么你的数据模型总被质疑? 在滴滴出行的一次核心业务会议上,数据团队与业务部门爆发了激烈争论:新上线的订单预测模型是否真的优于旧系统?数据工程师认为查询速度提升40%已是巨大成功,业务方却质疑…...
vscode ctrl+鼠标左键不能跳转
笔者使用的vscode版本是1.85.2(一周前从1.99降下来的,因为版本过高连不上服务器)。 使用python时突然发现代码看起来有些别扭,细看之下发现是import xxx语句中的包的颜色从之前的青色变成了现在的白色。再用ctrl左键点击包名试图…...
换动态IP对电脑有什么影响:全面解析与实用指南
在当今数字化时代,IP地址作为网络世界的"身份证",对我们的网络体验有着重要影响。许多用户出于某些原因,会考虑更换动态IP地址。那么,这种操作究竟会对我们的电脑产生哪些影响?是利大于弊还是弊大于利&#…...
Go语言从零构建SQL数据库(6) - sql解析器(番外)- *号的处理
番外:处理SQL通配符查询 在SQL中,SELECT * FROM table是最基础的查询之一,星号(*)是一个通配符,表示"选择所有列"。虽然通配符查询看起来简单,但在解析器中需要特殊处理。下面详细介…...
大模型推理引擎选型与应用场景分析:SGLang、Ollama、VLLM 和 LLaMA.cpp
在当下的大模型技术生态中,SGLang、Ollama、VLLM 和 LLaMA.cpp 各具特色,适用于不同的应用场景和用户需求。以下是它们的核心特点及适用场景的深度剖析: 1. SGLang:高性能企业级推理引擎 核心优势: 零开销批处理&…...
参考平面跨分割情况下的信号回流
前言:弄清楚信号的回流路径,是学习EMC和高速的第一步! 如果我们不管信号的回流路径,会造成什么后果?1、信号完整性问题,信号的回流路径不连续会导致信号反射、衰减和失真。2、信号衰减和噪声干扰ÿ…...
Vue2下载二进制文件
后端: controller: GetMapping(value "/get-import-template")public void problemTemplate(HttpServletRequest request, HttpServletResponse response) throws Exception {iUserService.problemTemplate(request, response);} service: void probl…...
AnimateCC基础教学:随机抽取花名册,不能重复
一.核心代码: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["张三", &quo…...
windows+cmake+vscode+NDK远程调试安卓端C++项目
windowscmakevscodeNDK远程调试安卓端C项目 windowscmakevscodeNDK远程调试安卓端C项目 windowscmakevscodeNDK远程调试安卓端C项目 使用C开发安卓端算法库时,需要使用NDK进行交叉编译。使用NDK编译代码时,需要编写.mk脚本进行代码的编译和链接…...
大语言模型(LLM)全解析:从原理到实战应用
在人工智能飞速发展的今天,大语言模型(LLM)已成为改变我们工作生活的重要技术。无论是ChatGPT的对话能力,还是DeepSeek的文本处理,背后都离不开LLM的强大支持。本文将用通俗易懂的语言,带您全面了解LLM的工作原理、训练方法、优化…...
Qt 入门 4 之标准对话框
Qt 入门 4 之标准对话框 Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。 本文将以一个新的项目为主介绍不…...