使用Kotlin+MVP+AndroidX搭建安卓项目框架

本教程介绍如何使用Kotlin协程结合MVP设计模式,基于AndroidX搭建安卓项目框架,涵盖项目创建、库迁移、权限配置、基类与工具类封装,以及MVP各部分详解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近深入学习了下kotlin,发现还是挺不错的,特别是其中的协程,改变了以往我对安卓开发使用线程的习惯,这东西用起来方便,省去了使用java而产生的各种回调和主子线程通讯的麻烦,当然如果你习惯了Java,要转kotlin并使用协程改造你的项目,成本还是挺大的。谷歌正在用kotlin逐步取代Java,同时也在用androidx替代android support包,而MVP也是这两年非常流行的设计模式(还有MVVM),为了紧跟潮流,本教程将手把手带你搭建一个基于kotlin+MVP+AndroidX的安卓项目基本框架,同时也可以让新手了解一个项目的搭建过程,如果你正在新做一个项目或者准备重构一个项目,希望本教程能给你些许参考价值。

在此之前,你得对以下知识有一定了解:

1.kotlin(特别是协程,这个百度能找到一大堆文档,这里就不详细赘述了)

2.MVP设计模式(参考我的另一博客:安卓MVP设计模式

实际上MVVM使用协程更方便,Kotlin对架构组件ViewModel提供了很好的支持,但MVVM的例子网上已经有很多了,我这里就来写写MVP上的使用。

别问为什么不用RxJava,问就是不喜欢(加上协程的话改造成本有点大而且不够优雅)。

开发工具:

Android Studio 3.2+(我用的是AS3.5)

一、创建项目

项目创建,基础语言选择kotlin(AS会自动帮你配置好kotlin,同时AS3.5默认使用了AndroidX),由于明确了使用MVP设计模式,所以我把项目结构设计如下:

其中规范可参考:安卓开发规范

二、AndroidX的迁移

谷歌官方有说到SDK 28.0.0版本还是采用android.support,但后续的版本都将采用androidx,因此虽然近期内我们可能没什么影响,但为了适配以后版本的变化,现在就开始逐步接入androidx绝对是一件好事。但是目前来说,很多第三方库还是用的support版本,因此给迁移带来了一定麻烦。完整的support与androidx映射关系请参考:官方文档

1.如果你已有项目,AndroidStudio3.2及以上版本提供了一键迁移功能,如下图:

2.迁移之前先保证你项目的gradle版本必须是3.2.0+,compileSdkVersion为28以上

classpath 'com.android.tools.build:gradle:3.5.2'

3.在gradle.properties文件里添加配置:

android.useAndroidX=true
android.enableJetifier=true
  • android.useAndroidX:如果设置为 true,Android 插件会使用相应的 AndroidX 库,而非support库。如果未指定,则该标记默认为 false
  • android.enableJetifier:如果设置为 true,Android 插件会重写其二进制文件,自动迁移现有的第三方库以使用 AndroidX。如果未指定,则该标记默认为 false

4.旧项目移除support.appcompat依赖,添加如下依赖:

implementation "androidx.appcompat:appcompat:1.0.2"

至此,迁移完毕

注意点:

1.在布局文件引用了support包的控件,包名需要手动修改为androidx的

2.引入第三方库看看是否支持androidx,支持的直接引入它的新版本

三、kotlin的迁移

参考我的另一篇博客: AndroidStudio配置kotlin

注意kotlin插件的版本也与gradle的版本有要求,注意对应关系。

//kotlin依赖
implementation "androidx.core:core-ktx:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.60"
//使用协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"

四、项目配置

(1)明确需要用到的第三方库,本项目使用了如下第三方库,常见的一些热门框架如butterknife,Glide等这些根据个人需要添加,这里只是示例项目,值得注意的是这些热门框架大部分已经开始支持androidx,这是一件好事。

//OkHttp
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
//今日头条屏幕适配方案
implementation 'me.jessyan:autosize:1.1.2'
//权限申请
implementation 'me.weyye.hipermission:library:1.0.7'

(2)填写项目所需的基本权限(在实际开发中按需增加)

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.INTERNET"/>

(3)各安卓版本的适配配置,参考:安卓版本适配之旅

(4)混淆规则配置,参考:安卓代码混淆(在实际开发中不断完善)

五、创建基类

在项目里,一般都会创建一些基类来封装一些通用的操作

六、封装工具类

在utils包下新建一些常用的工具类,封装一些通用的工具方法

七、MVP

MVP涉及到Model、View、Presenter

Model:用来存放一些网络、数据库、文件读写等操作,用于获取数据源

View:对应Activity、Fragment、Adapter等,只做UI操作,不做网络请求等耗时操作,

Presenter:执行Model提供的方法,获取数据,然后传递给View进行绑定显示

具体内容看项目源码

这样一个简易的项目框架基本就搭建完毕了,这个项目只是一个演示项目,没有太多业务逻辑,个人可以根据实际情况灵活变通。

后记:关于kotlin协程

1.协程作用域

GlobalScope:相当于全局作用域,不与具体Activity或Fragment生命周期关联,滥用会造成内存浪费

MainScope:理解为局部使用的作用域,可以跟Activity等生命周期关联起来

ViewModelScope:MVVM架构专属,项目使用了ViewModel的可以直接用这个

自定义作用域:

 private val viewModelJob = SupervisorJob()
 private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) //UI作用域
uiScope.launch {//主线程(UI线程)
         val deferred = async(Dispatchers.IO){//异步线程(IO线程)
                delay(2000)
                "result"
         }
         showToast(defferred.await())//UI操作
     }
 }

2.取消协程

协程创建后注意在Activity生命周期结束时要调用cancel()取消。

viewModelJob.cancel()

以上是基于MVP模式的架构,接下来我还会一步一步教大家如何改造成MVVM模式并且引入Lifecycle、LiveData、ViewModel等架构组件,敬请期待

<think>好的,我现在需要帮助用户了解如何使用Android Studio、Spring Boot和MySQL开发一个医疗挂号应用程序。首先,用户的问题涉及三个主要技术栈:Android前端、Spring Boot后端和MySQL数据库。我需要分步骤解释整个开发流程,并提供示例代码。同时,用户要求结构清晰,确保回答真实可靠,并引用提供的参考资料。 首先,我需要确定用户可能需要的功能模块。医疗挂号应用通常包括用户注册登录、科室医生查询、预约挂号、订单管理等功能。因此,后端需要设计相应的RESTful API,前端Android应用调用这些API,数据库则存储相关数据。 接下来,我需要参考用户提供的引用内容。引用[1]提到RBAC权限管理系统,可能在后端的用户权限管理部分有用。引用[3]提到了图片加载库如Glide,可能在Android端显示医生头像时使用。不过用户的问题中没有提到图片处理,但可能需要考虑扩展功能。 首先,后端部分使用Spring Boot搭建。需要创建实体类,如User、Department、Doctor、Appointment。使用JPA进行数据库操作,这样可以简化MySQL的交互。然后创建Controller处理HTTP请求,比如注册、登录、获取科室列表、预约等功能。需要确保接口符合RESTful规范,返回JSON数据。 数据库设计方面,用户表存储用户信息,科室表、医生表关联科室,预约表记录用户和医生的预约信息。可能需要外键关联,比如appointment表中的user_id和doctor_id关联到user和doctor表。 Android端需要实现界面,比如登录注册界面、科室列表、医生列表、预约界面等。使用Retrofit或OkHttp进行网络请求,调用后端的API。例如,用户登录时发送POST请求到/auth/login,获取token后保存到SharedPreferences中,后续请求携带token进行鉴权。 在代码示例部分,后端可以提供一个DoctorController,处理获取科室列表的GET请求。Android使用RecyclerView展示科室列表,通过Retrofit调用接口获取数据。需要处理异步请求,更新UI。 需要考虑的安全性问题,比如使用HTTPS传输数据,用户密码加密存储(Spring Security的密码编码),JWT token进行身份验证。引用[1]中的RBAC可能用于管理不同用户角色,比如患者、医生、管理员,但用户的问题可能暂时只需要患者角色,所以可以后续扩展。 可能遇到的问题包括数据库连接配置、API跨域处理、Android端网络权限和主线程网络请求限制(需要使用异步任务或协程)。此外,预约时间的冲突处理,比如同一用户不能重复预约同一时间段。 在教程步骤中,需要分步指导:环境搭建(安装Android Studio、IntelliJ IDEA、MySQL)、创建Spring Boot项目、配置数据库连接、定义实体和Repository、创建Controller、测试API。然后创建Android项目,设计界面,实现网络请求,处理数据展示和用户交互。 示例代码部分,后端可能需要User实体和Repository,AuthController处理登录注册。Android端需要有LoginActivity,发送登录请求,处理响应,跳转到主界面。主界面显示科室列表,点击进入医生列表,选择医生后进入预约界面,提交预约。 需要确保代码符合最佳实践,比如AndroidMVP或MVVM架构,后端的分层结构(Controller-Service-Repository)。引用[2]提到Java开发手册,可能涉及代码规范,如命名约定、异常处理等。 最后,生成相关问题,可能涉及性能优化、第三方库使用(如Glide加载图片)、安全加固、部署流程等。需要根据用户提供的引用和常见问题来设计。 总结:步骤分为后端开发、数据库设计、前端开发,每部分提供关键代码示例,引用相关资料,确保用户能够跟随教程搭建基础框架,并了解扩展方向。</think>### 医疗挂号APP开发教程(Android + Spring Boot + MySQL) #### 一、系统架构设计 采用**前后端分离架构**,Android端负责UI交互,Spring Boot提供RESTful API,MySQL存储数据。权限控制采用RBAC模型[^1]。 #### 二、后端开发(Spring Boot) 1. **数据库设计** 创建`hospital`数据库,包含核心表: ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE, password VARCHAR(100) -- Spring Security BCrypt加密存储 ); CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) -- 科室名称(内科/外科) ); CREATE TABLE doctor ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), department_id INT, -- 外键关联科室 FOREIGN KEY (department_id) REFERENCES department(id) ); CREATE TABLE appointment ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, doctor_id INT, appointment_time DATETIME ); ``` 2. **Spring Boot实体类定义** ```java @Entity public class Doctor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; } ``` 3. **RESTful API接口示例** ```java @RestController @RequestMapping("/api/doctors") public class DoctorController { @Autowired private DoctorRepository doctorRepository; @GetMapping("/byDepartment") public List<Doctor> getByDepartment(@RequestParam Long departmentId) { return doctorRepository.findByDepartmentId(departmentId); } } ``` #### 三、Android端开发 1. **网络请求配置(Retrofit)** ```kotlin interface ApiService { @GET("api/doctors/byDepartment") suspend fun getDoctorsByDepartment(@Query("departmentId") departmentId: Long): Response<List<DoctorDTO>> } val retrofit = Retrofit.Builder() .baseUrl("http://your-server-ip:8080/") .addConverterFactory(GsonConverterFactory.create()) .build() ``` 2. **科室列表展示(RecyclerView)** ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvDepartments" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> ``` #### 四、关键功能实现 1. **用户认证** 使用JWT实现安全认证: ```java // Spring Security配置 @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } ``` 2. **预约冲突检测** SQL查询优化: ```sql SELECT COUNT(*) FROM appointment WHERE doctor_id = ? AND appointment_time BETWEEN ? AND ? ``` #### 五、部署与优化建议 1. 使用Nginx反向代理Spring Boot应用 2. 启用MySQL查询缓存 3. Android端图片加载推荐使用Glide库[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值