基于androidx的跑步App源码解析:前后端与MySQL整合实战
简介这是一套面向高校计算机相关专业学生的安卓毕业设计完整项目主题为基于AndroidX的跑步应用适合正在准备毕业设计或课程设计、需要前后端一体化参考案例的开发者。项目实现注册登录、计步、计时、任务设定与数据存储等核心功能采用Java语言、JDK1.8、MySQL 5.7及以上数据库配合Navicat管理支持Eclipse或IDEA开发安卓端基于uniapp框架与HBuilder X采用混合开发模式兼顾原生性能与迭代效率。资源包共340个文件约37.33MB以145个xml布局与配置、60个png界面素材、48个java源码为主另含gradle构建脚本、so库、docx与doc说明文档、ppt答辩演示及mp3、mp4等多媒体素材并附数据库设计与运行环境配置说明。已有169人学习下载。读者可获得完整源码、说明文档、演示文件与需求分析便于快速理解项目架构、复现功能并撰写论文是安卓方向毕业设计的实用参考。1. 从一份安卓跑步 App 源码说起androidx 前后端 MySQL 到底能跑出什么很多人拿到「基于 androidx 的跑步 App 源码」这类压缩包第一反应是解压、用 Android Studio 打开、点运行然后卡在 Gradle 同步失败或者后端连不上数据库。这个标题背后其实是一套完整的工程组合Android 端用 androidx 做 UI 和生命周期管理后端提供接口MySQL 存用户和跑步记录再加一份说明文档和论文LW 通常指论文。它解决的不是「跑步」这个业务本身而是给你一个能改、能交、能演示的完整项目骨架。适合两类人一是要做毕业设计、课程设计的学生需要一份结构清晰、能讲清楚前后端怎么连的代码二是想快速搭一个带服务端和数据库的移动端 Demo 的开发者拿它当脚手架比从零写省事。但前提是你得知道每一层在哪里、怎么配、哪里最容易翻车。2. androidx 跑步 App 的工程结构先看清模块再动手2.1 为什么是 androidx 而不是旧 support 库androidx 是 Android 官方现在主推的包结构旧项目里常见的android.support.v7.app.AppCompatActivity在 androidx 里对应androidx.appcompat.app.AppCompatActivity。跑步 App 这类项目通常会用到RecyclerView展示历史记录、Room或直接OkHttp请求后端、ViewModelLiveData管理跑步状态。如果源码里混用了 support 库和 androidxGradle 同步阶段就会报This project uses AndroidX dependencies, but the android.useAndroidX property is not enabled。常见做法是在gradle.properties里加两行android.useAndroidXtrue android.enableJetifiertrueuseAndroidX告诉构建系统用 androidx 包名enableJetifier会把第三方库里还在用旧 support 包的依赖自动转成 androidx。注意Jetifier 只是过渡手段如果某个库明确不支持 androidx转完可能运行时崩这时候要么换库要么找新版。2.2 前后端目录怎么分、怎么连一份完整的前后端源码压缩包解开后通常长这样目录/文件作用你要改的地方app/Android 端源码build.gradle里的 SDK 版本、依赖server/或backend/后端接口代码数据库连接、端口、接口路径sql/或db/建表语句库名、字符集、初始数据docs/或说明文档部署和接口说明按自己环境改配置LW/论文相关一般不用动代码Android 端连后端最常见的是在Retrofit或OkHttp里写一个BASE_URL。如果你在本机跑后端模拟器访问宿主机要用10.0.2.2真机则要用电脑的局域网 IP。很多源码默认写的是localhost模拟器里跑必然连不上这是第一个高频翻车点。// Retrofit 构建示例注意 BASE_URL 结尾要带 / Retrofit retrofit new Retrofit.Builder() .baseUrl(http://10.0.2.2:8080/) // 模拟器访问宿主机 .addConverterFactory(GsonConverterFactory.create()) .build();baseUrl必须以/结尾否则 Retrofit 会抛IllegalArgumentException。端口8080要和你后端实际启动端口一致。如果后端用了 Spring Boot默认就是 8080如果改了server.port这里同步改。2.3 跑步记录的数据流从定位到入库跑步 App 的核心链路是定位拿经纬度 → 计算距离和配速 → 本地暂存 → 上传后端 → 写入 MySQL。Android 端一般用FusedLocationProviderClient或系统LocationManager。拿到点之后用Location.distanceBetween()算两点间距离累加得到总里程。配速用总时间除以公里数。这些数据先存Room或SharedPreferences等有网再传。后端接收的接口通常长这样PostMapping(/run/record) public Result saveRecord(RequestBody RunRecord record) { // record 里包含 userId、distance、duration、startTime return Result.ok(runService.save(record)); }RunRecord实体对应 MySQL 一张表字段至少要有id、user_id、distance、duration、start_time、create_time。注意distance用double还是decimal跑步距离建议decimal(10,2)避免浮点误差在统计时越滚越大。3. 把 MySQL 和后端跑起来建库、改配置、验接口3.1 建库建表字符集和主键别踩坑拿到sql文件后不要直接双击导入先看一眼里面有没有CREATE DATABASE。如果没有自己先建库CREATE DATABASE running_app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE running_app;utf8mb4是为了存 emoji 和特殊字符跑步 App 的用户昵称里很可能有。然后执行建表语句。常见表有user、run_record、feedback等。检查每张表的主键是不是bigint自增外键有没有加索引。如果run_record的user_id没索引后面按用户查记录会全表扫数据一多就慢。CREATE TABLE run_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, distance DECIMAL(10,2) NOT NULL DEFAULT 0, duration INT NOT NULL DEFAULT 0, start_time DATETIME NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;duration用秒存整数前端展示再转成hh:mm:ss。start_time用DATETIME而不是TIMESTAMP避免时区转换把跑步时间改掉。3.2 后端数据库配置四个参数必须对齐后端连 MySQL不管用什么框架核心就四个参数URL、用户名、密码、驱动。以常见的 Spring Bootapplication.properties为例spring.datasource.urljdbc:mysql://localhost:3306/running_app?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai spring.datasource.usernameroot spring.datasource.password你的密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.DriverserverTimezone必须写否则 MySQL 8 驱动会报时区错误。characterEncodingutf8配合库的utf8mb4使用。如果 MySQL 是 5.7驱动类名可以用com.mysql.jdbc.Driver但建议统一用com.mysql.cj.jdbc.Driver兼容性更好。改完配置启动后端看日志里有没有HikariPool启动成功和端口监听信息。3.3 用 curl 验接口别等 App 跑起来再查后端起来后先用curl或 Postman 测一个最简单的接口比如登录或获取用户信息。不要等 Android 端打包安装再去排查那样变量太多。curl -X POST http://localhost:8080/user/login \ -H Content-Type: application/json \ -d {username:test,password:123456}如果返回{code:200,data:{...}}说明后端和数据库通了。如果返回 500看后端日志里的 SQL 异常如果连接被拒检查端口和防火墙。这一步过了再去改 Android 端的BASE_URL能省掉大量来回折腾的时间。4. 避坑与排查跑步 App 源码最常见的 5 个翻车点4.1 现象Gradle 同步报Failed to resolve: androidx.appcompat:appcompat原因通常是网络拉不到 Google 的 Maven 仓库或者项目里repositories只写了jcenter()已停服。解决在项目级build.gradle里确保有google()和mavenCentral()顺序放在前面。repositories { google() mavenCentral() }如果公司网络有限制配置镜像仓库但注意镜像同步可能有延迟缺版本时换回官方源再试。4.2 现象App 安装后闪退日志报ClassNotFoundException: androidx.room.Room原因一般是依赖只加了implementation但没加注解处理器或者 Room 版本和 androidx 其他库冲突。解决检查build.gradle里有没有annotationProcessor androidx.room:room-compiler:版本号版本号要和room-runtime一致。如果用了 Kotlin换成kapt。4.3 现象跑步记录上传成功但数据库里时间是 1970 年或差 8 小时原因Android 端传的是时间戳后端用new Date()直接存或者 MySQL 时区没设。解决后端接收时明确用LocalDateTime并指定时区或者统一传 ISO8601 字符串。MySQL 连接串里加serverTimezoneAsia/Shanghai建表用DATETIME。4.4 现象模拟器里定位一直返回 null原因模拟器默认没有 GPS 信号或者没在 Extended Controls 里发送位置。解决打开模拟器右侧...→Location手动设一个经纬度并点Send。代码里加权限检查ACCESS_FINE_LOCATION要在运行时申请不能只在 Manifest 里声明。4.5 现象后端接口返回中文乱码原因数据库字符集、连接串字符集、后端响应编码三者不一致。解决库用utf8mb4连接串加characterEncodingutf8Spring Boot 里配置spring.http.encoding.forcetrue。如果用了 Nginx 反代检查charset指令。5. 让这份源码真正变成你的改哪里、怎么验、怎么讲清楚拿到源码跑通只是第一步毕业设计或项目交付要的是你能说清楚每一层在干什么。我一般会先做三件事把BASE_URL改成自己后端的地址并确认模拟器能访问把数据库里user表加一条测试账号避免注册流程卡住把跑步记录上传接口的日志打开看每次请求的参数和返回。这三步做完整个链路就是通的。接下来是改造成你自己的东西。跑步 App 最容易加的功能是「历史记录按周统计」和「配速曲线」。统计可以在后端用 SQL 做SELECT DATE(start_time) AS day, SUM(distance) AS total FROM run_record WHERE user_id ? AND start_time DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY DATE(start_time) ORDER BY day;这条语句按天汇总最近 7 天的距离DATE_SUB和INTERVAL是 MySQL 的日期函数?是用户 ID 占位符。前端拿到数组后直接用MPAndroidChart画柱状图。注意start_time要有索引否则数据量上来后这条查询会拖慢整个接口。验证方法上不要只看 App 界面显示的数字。用adb logcat过滤你的包名看定位回调的频率和上传请求的响应码。如果定位回调间隔太短耗电会很快太长轨迹会飘。常见做法是 3 到 5 秒一次移动距离超过 10 米才记录一个点。这些参数在LocationRequest里设LocationRequest request LocationRequest.create(); request.setInterval(5000); // 5 秒 request.setFastestInterval(3000); request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); request.setSmallestDisplacement(10); // 移动 10 米才更新setSmallestDisplacement是省电和防飘的关键静止时不会疯狂回调。PRIORITY_HIGH_ACCURACY会同时用 GPS 和网络室内可能慢但跑步场景够用。最后说一个我踩过的坑论文或说明文档里写「前后端分离」但代码里 Android 端直接拼 SQL 或者后端把 HTML 返回给 App这就不叫分离。真正的分离是 App 只认 JSON 接口后端只返回数据不关心谁在调。检查方法很简单把后端接口用浏览器打开如果返回的是 JSON 而不是页面方向就对了。希望帮到你。本文还有配套的精品资源点击获取