公众号和网站先做哪个拼多多代运营公司十大排名

pingmian/2025/10/9 7:52:18/文章来源:
公众号和网站先做哪个,拼多多代运营公司十大排名,招商加盟合作代理平台,网站移动适配怎么做在Android笔记#xff08;二十二#xff09;#xff1a;Paging3分页加载库结合Compose的实现网络单一数据源访问一文中#xff0c;实现了单一数据源的访问。在实际运行中#xff0c;往往希望不是单纯地访问网络数据#xff0c;更希望将访问的网络数据保存到移动终端的SQL…在Android笔记二十二Paging3分页加载库结合Compose的实现网络单一数据源访问一文中实现了单一数据源的访问。在实际运行中往往希望不是单纯地访问网络数据更希望将访问的网络数据保存到移动终端的SQLite数据库中使得移动应用在离线的状态下也可以从数据库中获取数据进行访问。在本笔记中将讨论多层次数据的访问即结合网络资源本地SQLite数据库中的数据的处理。在本笔记中仍然采用Android笔记二十二中的网络资源 上列展示的json数组包含了多个json对象每个json对象的格式类似下列形式 {actors:演员, directors:导演, intro:电影简介, poster:http://localhost:5000/photo/s_ratio_poster/public/p2626067725.jpg, region:地区, release:发布年份, trailer_url:https://localhost:5000/trailer/268661/#content, video_url:https://localhost:5000/d04d3c0d2132a29410dceaeefa97e725/view/movie/M/402680661.mp4}一、分层次访问数据的架构 与单一数据源结构不同在于增加了RemoteMediator。当应用的已缓存数据用尽时RemoteMediator 会充当来自 Paging 库的信号。可以使用此信号从网络加载更多数据并将其存储在本地数据库中PagingSource 可以从本地数据库加载这些数据并将其提供给界面进行显示。 当需要更多数据时Paging 库从 RemoteMediator 实现调用 load() 方法。这是一项挂起功能因此可以放心地执行长时间运行的工作。此功能通常从网络源提取新数据并将其保存到本地存储空间。 此过程会处理新数据但长期存储在数据库中的数据需要进行失效处理例如当用户手动触发刷新时。这由传递到 load() 方法的 LoadType 属性表示。LoadType 会通知 RemoteMediator 是需要刷新现有数据还是提取需要附加或前置到现有列表的更多数据。 通过这种方式RemoteMediator 可确保应用以适当的顺序加载用户要查看的数据。 二、定义实体类 1.定义Film类 Entity(tableNamefilms) data class Film(PrimaryKey(autoGenerate false)SerializedName(name)val name:String,SerializedName(release)val release:String,SerializedName(region)val region:String,SerializedName(directors)val directors:String,SerializedName(actors)val actors:String,SerializedName(intro)val intro:String,SerializedName(poster)val poster:String,SerializedName(trailer_url)val trailer:String,SerializedName(video_url)val video:String )在上述代码中将Film类映射为数据库中的数据表films。对应的数据表结构如下所示 2.定义FilmRemoteKey类 因为从网络访问每一个条电影记录需要知道记录的上一页和下一页的内容因此定义FilmRemoteKey类代码如下 Entity(tableName filmRemoteKeys) data class FilmRemoteKey(PrimaryKey(autoGenerate false)val name:String,val prePage:Int?,val nextPage:Int? )FilmRemoteKey对应的数据表结构如下 name表示电影名也是关键字 prePage表示记录的上一页的页码因为第一页的所有记录没有上一页因此前5条记录的prePage均为空 nextPage表示记录的下一页的页面。 三、定义网络访问 1.网络访问服务接口 interface FilmApi {GET(film.json)suspend fun getData(Query(page) page:Int,Query(size) size:Int):ListFilm }2.Retrofit构建网络服务 object RetrofitBuilder {private const val BASE_URL http://10.0.2.2:5000/private fun getRetrofit(): Retrofit {return Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build()}val apiService:FilmApi getRetrofit().create(FilmApi::class.java) }四、定义数据库的访问 1.电影数据访问对象的接口 Dao interface FilmDao {/*** 插入数据列表* param films ListFilm*/Insert(onConflict OnConflictStrategy.REPLACE)suspend fun insertAll(films: ListFilm)/*** 检索所有的Film记录* return PagingSourceInt, Film*/Query(select * from films)fun queryAll(): PagingSourceInt, Film/*** Delete all* 删除表films中所有记录*/Query(DELETE FROM films)suspend fun deleteAll() }2.电影页码数据访问对象的接口 Dao interface FilmRemoteKeyDao {Query(SELECT * FROM filmRemoteKeys WHERE name :name)suspend fun findByName(name:String):FilmRemoteKeyInsert(onConflict OnConflictStrategy.REPLACE)suspend fun insertAllKeys(remoteKeys:ListFilmRemoteKey)Query(DELETE FROM filmRemoteKeys)suspend fun deleteAllKeys() }3.创建数据库 Database(entities [Film::class,FilmRemoteKey::class], version 1) abstract class FilmDatabase : RoomDatabase() {abstract fun filmDao(): FilmDaoabstract fun filmRemoteKeyDao():FilmRemoteKeyDaocompanion object{private var instance: FilmDatabase? null/*** 单例模式创建为一个FilmDB对象实例*/Synchronizedfun getInstance(context:Context FilmApp.context): FilmDatabase {instance?.let{return it}return Room.databaseBuilder(context,FilmDatabase::class.java,filmDB.db).build()}} }五、定义代码层 1.定义RemoteMediator类 OptIn(ExperimentalPagingApi::class) class FilmRemoteMediator(private val database:FilmDatabase,private val networkService:FilmApi ) : RemoteMediatorInt, Film() {private val filmDao database.filmDao()private val filmRemoteKeyDao database.filmRemoteKeyDao()override suspend fun load(loadType: LoadType,state: PagingStateInt, Film): MediatorResult {return try{/*** 从数据库获取缓存的当前页面*/val currentPage:Int when(loadType){//UI初始化刷新LoadType.REFRESH- {val remoteKey:FilmRemoteKey? getRemoteKeyToCurrentPosition(state)remoteKey?.nextPage?.minus(1)?:1}//在当前列表头添加数据使用LoadType.PREPEND- {val remoteKey getRemoteKeyForTop(state)val prevPage remoteKey?.prePage?:return MediatorResult.Success(remoteKey!null)prevPage}//尾部加载更多的记录LoadType.APPEND-{val remoteKey getRemoteKeyForTail(state)val nextPage remoteKey?.nextPage?:return MediatorResult.Success(remoteKey!null)nextPage}}/*** 联网状态下的处理* 获取网络资源* response*/val response networkService.getData(currentPage,5)val endOfPaginationReached response.isEmpty()val prePage if(currentPage 1) null else currentPage-1val nextPage if(endOfPaginationReached) null else currentPage1database.withTransaction{//刷新记录需要删除原有的记录if(loadType LoadType.REFRESH){filmDao.deleteAll()filmRemoteKeyDao.deleteAllKeys()}//获取的记录映射成对应的索引记录val keys:ListFilmRemoteKey response.map{film:Film-FilmRemoteKey(film.name,prePage,nextPage)}filmRemoteKeyDao.insertAllKeys(keys)filmDao.insertAll(response)}MediatorResult.Success(endOfPaginationReached)}catch(e:IOException){MediatorResult.Error(e)}catch(e:HttpException){MediatorResult.Error(e)}}/*** 获取当前位置对应的FilmRemoteKey* param state PagingStateInt, Film* return FilmRemoteKey?*/private suspend fun getRemoteKeyToCurrentPosition(state:PagingStateInt,Film):FilmRemoteKey?state.anchorPosition?.let{position:Int-state.closestItemToPosition(position)?.name?.let{name:String-filmRemoteKeyDao.findByName(name)}}/*** 获取当前页面从头部第一个位置对应的FilmRemoteKey* param state PagingStateInt, Film* return FilmRemoteKey?*/private suspend fun getRemoteKeyForTop(state:PagingStateInt,Film):FilmRemoteKey?state.pages.firstOrNull{ it:PagingSource.LoadResult.PageInt,Film-it.data.isNotEmpty()}?.data?.firstOrNull()?.let{film:Film-filmRemoteKeyDao.findByName(film.name)}/*** 获取当前尾部最后一个位置对应的FilmRemoteKey* param state PagingStateInt, Film* return FilmRemoteKey?*/private suspend fun getRemoteKeyForTail(state:PagingStateInt,Film):FilmRemoteKey?state.pages.lastOrNull{it:PagingSource.LoadResult.PageInt,Film-it.data.isNotEmpty()}?.data?.lastOrNull()?.let{film:Film-filmRemoteKeyDao.findByName(film.name)} }2.定义PagingSource数据源 ExperimentalPagingApi class FilmRepository(private val filmApi:FilmApi,private val filmDatabase:FilmDatabase ) {fun getAllFilms(): FlowPagingDataFilm {val pagingSourceFactory:()-PagingSourceInt, Film {filmDatabase.filmDao().queryAll()}return Pager(config PagingConfig(pageSize 5),initialKey null,remoteMediator FilmRemoteMediator(filmDatabase,filmApi),pagingSourceFactory pagingSourceFactory).flow} }六、定义视图模型层 OptIn(ExperimentalPagingApi::class) class MainViewModel(): ViewModel() {val filmRepository:FilmRepository FilmRepository(RetrofitBuilder.apiService,FilmDatabase.getInstance())fun getFilms()filmRepository.getAllFilms() }七、定义界面层 1.单独电影界面的定义 Composable fun FilmCard(film: Film?) {Card(modifier Modifier.fillMaxSize().padding(2.dp),elevation CardDefaults.cardElevation(5.dp),colors CardDefaults.cardColors(containerColor Color.DarkGray)){Column{Row(modifier Modifier.fillMaxSize()){AsyncImage(modifierModifier.width(180.dp).height(240.dp),model ${film?.poster},contentDescription ${film?.name})Column{Text(${film?.name},fontSize 18.sp,color Color.Green)Text(导演${film?.directors},fontSize 14.sp,color Color.White)Text(演员${film?.actors}, fontSize 14.sp,color Color.Green)}}Text(${film?.intro?.subSequence(0,60)} ...,fontSize 14.sp,color Color.White)Row(horizontalArrangement Arrangement.End,modifier Modifier.fillMaxSize()){Text(More,fontSize12.sp)IconButton(onClick {}){Icon(imageVector Icons.Default.MoreVert,tint Color.Green,contentDescription 更多...)}}}} }2.定义电影列表 Composable fun FilmScreen(mainViewmodel:MainViewModel){val films mainViewmodel.getFilms().collectAsLazyPagingItems()Column(horizontalAlignment Alignment.CenterHorizontally,modifier Modifier.background(Color.White)){LazyColumn{items(films.itemCount){FilmCard(films[it])}}} }八、定义主活动MainActivity class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {val mainViewModel:MainViewModel viewModel()Ch11_DemoTheme {// A surface container using the background color from the themeSurface(modifier Modifier.fillMaxSize(),color MaterialTheme.colorScheme.background) {FilmScreen(mainViewmodel mainViewModel)}}}} }参考文献 Paging库概览 https://developer.android.google.cn/topic/libraries/architecture/paging/v3-overview?hlzh-cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建立购物网站 app网赌网站建设多少钱

此系统设计主要采用的是python语言来进行开发,采用django/flask框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一…

做推广要知道的网站万能网页视频下载器

/************************************************************FileName: getini.h // 文件名称Author: yuanfen127 // 作者Date: 2005-03-31 // 日期Description: // 描述本文件的内容,功能,内部各部分之间的关系// 以及文本文件与…

湖南高端网站制作公司建筑招投标网官网

1.常用函数介绍 0 设备准备 device torch.device("cuda:0" if torch.cuda.is_available() else "cpu")这行代码是用来选择设备的,根据是否有可用的 CUDA 设备来选择使用 GPU 还是 CPU 进行计算。 更详细的解释如下: torch.cuda.…

html5商城网站开发做器材的网站

Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。 escape 和 unescape 实际上,esca…

网站开发入门培训机构wordpress中文相册插件下载

前言: 谈到“架构”这两个字,会有好多的名词闪现,比如:分层架构、事件驱动架构、DDD、CQRS等。亦或者一堆的软件设计原则,如:KISS原则(Keep it Simple and Stupid)、SOLID原则(单一责任原则、开…

建设新网站wordpress点击图片上传

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

网站设计入门杭州盘石做网站专业吗

如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符,并对另…

正规品牌网站设计推荐做网站开发哪里可以接单

背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的。当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就是扩展名为DCM文件的格式说明…

郑州外贸网站建设公司专门下软件的app

目录 实验条件网络拓朴需求 配置实现1. 配置PC1~3, DHCP_Server的vlan2. VLAN10、20的网关为MSW1对应的SVI,VLAN30、40的网关为MSW2对应的SVI;3. 配置5台交换机之间线路均为Trunk4. 配置5台交换机均启用Rapid-PVST(RSTP)5. 配置DHCP Server,创…

傻瓜自助建站软件产品推广渠道有哪些

互联网的发展,的确方便了现代人生活。视频电话、出去买东西你都不用带钱带卡,手机一扫就可以完成支付。很多中小学的家长都会建一个家长群,方便老师和家长的沟通。这个群可以说是家长和学校的桥梁和纽带,家长们为了支持老师的工作…

镇江房地产网站建设网站策划模板

单例模式(Singleton):指在一个系统中某个类只存在一个实例,类中自行实例化,实例向该系统提供统一的访问接口。 单例模式有两种表现形式,饿汉式:类加载时,就进行实例化;懒…

微网站建设图片代做网页设计

1、学之前存在的问题 1、你被JVM伤害过吗? 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一…

做哈尔滨本地门户网站赚钱吗深圳网站建设快速排名

事务 1 )概述 只有 innodb 引擎支持事务,myisam 是不支持的事务的本质是原子性操作,不可分割,打包多个操作成为一个原子 2 )事务的四大特性(ACID) 原子性 Atomicity 原子性是指事务包含的所有操作不可分割要成功一…

教学网站建设计划广州天河娱乐场所最新通知

题目描述 题目描述 输出列表的平均值。题中有一个包含数字的列表 [19, 39, 130, 48, 392, 101, 92],使用 for 循环输出这个列表中所有项的平均值。 输入描述 无输入。 输出描述 输出列表的平均值。 示例 示例 ① 输出: 列表的平均值是&#xf…

广东制冷设备网站建设费用wordpress信息搜集

要做什么Steiner:[Selenium] 简单介绍​zhuanlan.zhihu.com我们用刚才学到的知识去用selenium来模拟与表单交互,还好有个可以练习的网站 test website 拿这个网站来试试输入用户名,密码ps: 其实这个自己在本地写个网页就行了,ajax…

英文网站的首页怎么做大连建设网煤气查询

如何正确的显示随机信息? 我们来模拟在英语单词app当中随机出现三个英语单词的情况,我们首先创建一张表words,然后给这个表当中插入10000条信息进行量化。 select word from words order by rand() limit 3; order by rand&…

公司网站建设代理怎么做开发者选项在哪里关闭

(1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 当初选择计算机专业是因为之前看大佬们参加信息竞赛,觉得很厉害、很有意思,而且也希望能自己做一款游戏出来,所以就选…

app展示网站模板免费下载重庆巴南区网站开发公司

关于奎享雕刻软件单线字书写操作步骤的简要说明特别提醒!设备完全调试好以后再练习写字,调试好的标志是用微雕管家刀路雕刻界面能顺利画出一张........&#…

网络推广网站怎么做免费的网站空间

目录 一、# 符号和$ 符号区别: # 符号: $ 符号: 二、使用场景: # 符号 $ 符号: 三、XML代码示例 四、总结: 五、扩展:sql注入介绍及危害 在 MyBatis 中,$ 和 # 都是用于参数…

简单的网站制作网页设计与网站建设有区别吗

最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是Title)的翻转以及90旋转,弄得焦头烂额。在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在绘图的时…