技术交流: QQ: 2506789532 WX: wjk655955
开源和写教程是因为大家可能都和我一样, 刚接触这个比赛, 啥都不知道,希望我这源码跟教程能给你帮助。 该项目是我比赛前一个月练习的, 由于赶时间, 画的UI布局不是那么的合格,现在你可以参考参考我的来修改优化, 所有题目都差不多写完了, 后续我也会慢慢更新修改, 我也当作是我学习项目的一部分了, 到时可能会添加一些第三方的库这些我会写注释, 但你看到这注释时可以放弃学习这部分代码。
说说比赛需要的注意事项, 比赛是一定要注意插件是否添加完(我当时就忘记了了一个插件 okio-jvm-2.8.0.jar这个插件浪费我半个小时的时间), 一定要根据题目的要求来写, 千万不要造轮子! 裁判是不会看你代码的, 不要想着我就一直造轮子给裁判看看, 我写的代码多牛, 这是徒劳的, 比赛提交成果物后, 你电脑上是需要运行你打包好的apk放在桌面上, 模拟器也要运行, 放在桌面上, 裁判会自己下来评分, 比赛那么多人, 是没时间慢慢看你写的代码的, 能使用插件就使用插件, 比赛前实训的时候, 自己把接口的题目全练习一遍, 把一些重复性很高的代码全封装了,
Kotlin/Kotlin协程, Android这两个是必须要会的,还有一些第三方插件, 比如Banner, ViewPager2, Retrofit, OkHttp, glide, GsonFormat, MPAndroidChart。 建议还是先把Kotlin和Android学完, 然后跟着比赛试题一步一步写, 到时候会有一些效果实现需要使用到上面这些插件。 我也是一步一步的了解这些插件再到运用。 然后就要搞你自己了, 加油!
我自己写了一个智慧城市教程PDF源代码地址: SmartCity_Course: 职业院校技能大赛(移动应用开发项目)智慧城市教程kotlin版 (gitee.com) 需要PDF教程请添加我的wx/QQ (gitee上传不了大文件)
比赛是支持Kotlin协程的, 还有Retrofit也是支持协程,Retrofit可以配合Kotlin协程来访问网络, 方便快捷。 然后比赛不用将数据返回ViewModel,我们直接拿数据填充UI展示出来
接下来看看Retrofit如何配合Kotlin协程来访问网络的
/**
* 定义一个名为 coroutine 的函数,接受两个参数:
* 1. context: CoroutineContext,协程的上下文,默认为 Dispatchers.IO。
* 2. block: 一个挂起函数,该函数在协程内执行。
*/
fun coroutine(
// 协程的上下文,默认为 Dispatchers.IO
context: CoroutineContext = Dispatchers.IO,
block: suspend CoroutineScope.() -> Unit
): Job {
// 创建一个 CoroutineScope,并使用给定的上下文启动一个协程。
// 返回一个 Job 对象,用于管理和监控协程的状态。
return CoroutineScope(context).launch {
try {
// 在协程内部创建一个新的 coroutineScope。
coroutineScope {
// 调用传入的挂起函数 block。
block()
}
} catch (e: Exception) {
// 捕获并处理协程内部的异常,打印异常堆栈信息。
e.printStackTrace()
}
}
}
class ServiceNET {
companion object{
// 服务器地址
private const val BASE_URL = "http://124.93.196.45:10001/"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
// 通过.Class对象进行网络请求: create(API接口对象)
fun <E> create(service: Class<E>) : E = retrofit.create(service)
// 以泛型的方式进行网络请求: create<接口对象>()
inline fun <reified E> create() : E = create(E::class.java)
}
}
interface api {
// 比赛提供的Retrofit版本是支持kotlin协程的
// 不用Call<类名>了
// 直接 : BannerModel
// 获取轮播图
@GET("/prod-api/api/rotation/list")
suspend fun getBanner(@QueryMap mp: Map<String, Int>) : BannerModel
}
companion object {
/*
静态属性 api,用于进行网络访问请求
create<Class?> 是我们封装Retrofit是创建的一个内联函数
inline fun <reified E> create() : E = create(E::class.java)
使用也很简单, 我们直接调用api后跟个.来获取我们在接口中定义的挂起函数来访问网络
使用: api.getBanner(传入参数)
*/
val api = create<api>()
}
// 定义一个挂起函数 setBanner,用于异步获取广告轮播图数据。
private suspend fun setBanner() {
// 调用 api 的 getBanner 方法,传入参数 mapOf("pageNum" to 1, "pageSize" to 8, "type" to 2)
api.getBanner(mapOf("pageNum" to 1, "pageSize" to 8, "type" to 2)).apply {
// 使用 apply 函数,将代码块作用于 api.getBanner() 的返回结果,即网络请求的响应实体。
// 在这里直接通过 this 来获取实体类的数据,比如判断是否网络请求成功
// 例如,判断返回的状态码是否为 200
if (this.code == 200) {
// 请求成功,可以在这里处理获取到的数据
// 比如,可以通过 this.data 获取具体的数据
} else {
// 请求失败,可以在这里处理失败的情况
}
}
}
// 定义一个私有函数 runThread,它使用之前定义的 coroutine 函数启动一个协程。
private fun runThread() = coroutine {
// 在这里可以调用挂起函数方法,这些方法将在协程中执行。
// 例如:
// 挂起函数方法 ...
setBanner()
}
// 定义一个私有函数 runThread,它使用 coroutine 函数启动一个在主线程上执行的协程。
private fun runThread() = coroutine(Dispatchers.Main) {
// 在这里可以调用挂起函数方法,这些方法将在主线程的协程中执行。
// 例如:
// 调用挂起函数
setBanner()
}
ok, 到这里就完了, 我们前期只需要封装好协程, Retrofit, 接口这些, 以后我们需要访问那个接口, 我们只需要在api接口中定义方法就可以了,然后创建返回数据的对应模型就可以了,
使用Android studio 4.0开发
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。