本章记录一个基础的 demo 项目,使用 kotlin+协程+retrofit+okhttp3+MVVM 实现。
调用天气 api,在主页显示天气情况。
这里使用万维易源的数据源,首先注册并登录账号。
通用网络请求实体 CResponse
/**
* 通用网络请求
*/
data class CResponse(
@SerializedName("showapi_res_error")
val msg: String,//错误提示
@SerializedName("showapi_res_code")
val code: Int,//错误码
@SerializedName("showapi_res_body")
val data: T//数据
)
天气实体
/**
* 天气
*/
data class Weather(
val time: Long,//预报发布时间
val now: WeatherDetail//天气详情
)
天气详情实体
/**
* 天气详情
*/
data class WeatherDetail(
val aqi: String,//空气指数
val rain: String,//下雨时间点
val sd: String,//空气湿度
val temperature: String,//气温
@SerializedName("temperature_time")
val temperatureTime: String,//获得气温的时间
val weather: String,//天气
@SerializedName("weather_pic")
val weatherPic: String,//天气小图标
@SerializedName("wind_direction")
val windDirection: String,//风向
@SerializedName("windPower")
val windPower: String//风力
)
在 AndroidManifest.xml 中添加网络请求权限,代码如下:
在 build.gradle 文件中添加依赖,代码如下:
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.10"
// 协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0"
// 协程Android支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0"
implementation "androidx.activity:activity-ktx:1.2.3"
implementation "androidx.fragment:fragment-ktx:1.3.5"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
// okhttp
implementation "com.squareup.okhttp3:okhttp:4.9.0"
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'//日志拦截器
// retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-scalars:2.9.0"//支持返回结果是string
implementation "com.squareup.retrofit2:converter-gson:2.9.0"//支持返回结果是实体
网络请求封装,添加基础访问地址,拦截器等,最后目的是能有个可以得到 service 的方法。
/**
* 通用数据
*/
object HttpConstant {
/**
* 访问地址
*/
const val BASE_HTTP = "https://route.showapi.com"
/**
* appID
*/
const val APP_ID = "替换为万维易源的appId"
/**
* app_sign
*/
const val APP_SIGN = "替换为万维易源的sign"
}
/**
* 通用参数拦截器
*/
class CommonInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val oldRequest = chain.request()
val httUrl = oldRequest.url
val urlBuilder = httUrl.newBuilder()
/** 添加公共参数 */
urlBuilder.addQueryParameter("showapi_appid", HttpConstant.APP_ID)
urlBuilder.addQueryParameter("showapi_sign", HttpConstant.APP_SIGN)
val request = oldRequest
.newBuilder()
.url(urlBuilder.build())
.build()
return chain.proceed(request)
}
}
/**
* Retrofit管理类
*/
object RetrofitManager {
/**
* okhttpClient
*/
private val okhttpClient: OkHttpClient
get() = OkHttpClient.Builder()
.addInterceptor(CommonInterceptor())//通用参数拦截器
.addInterceptor(HttpLoggingInterceptor())//日志拦截器
.followRedirects(true)
.build()
/**
* 构建service
*/
fun getService(serviceClass: Class): T {
val retrofit = Retrofit.Builder().apply {
baseUrl(HttpConstant.BASE_HTTP)//基础访问地址
client(okhttpClient)
addConverterFactory(GsonConverterFactory.create())//Gson转换工厂
addConverterFactory(ScalarsConverterFactory.create())//String转换工厂
}.build()
return retrofit.create(serviceClass)
}
}
主界面显示当前的天气情况即可,使用 databinding 方式,代码如下。
在项目构架过程中,都会习惯性地将一些公共方法或者属性进行封装操作,方便后续使用。
/**
* 基础ViewModel
*/
abstract class BaseViewModel : ViewModel() {
/** 初始化数据 */
abstract fun start()
}
/**
* 基础类Activity
*/
abstract class BaseActivity(private val contentViewResId: Int) :
AppCompatActivity() {
lateinit var mViewModel: VM
lateinit var mBinding: VB
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initViewModel()
initDataBinding()
initView()
initData()
}
/**
* 初始化ViewModel
*/
private fun initViewModel() {
//注意:actualTypeArguments[0] 0-->指上面BaseActivity的VM放在第一个
val type: Class =
(this.javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class
mViewModel = ViewModelProvider(this).get(type)
mViewModel.start()
}
/**
* 初始化dataBinding
*/
private fun initDataBinding() {
mBinding = DataBindingUtil.setContentView(this, contentViewResId)
mBinding.apply {
//绑定生命周期
lifecycleOwner = this@BaseActivity
//mBinding绑定viewModel
setVariable(BR.viewModel, mViewModel)
}
}
/**
* 初始化UI
*/
abstract fun initView()
/**
* 初始化数据
*/
abstract fun initData()
}
/**
* api接口
*/
interface Api {
/**
* 请求天气
* @param area 地址 eg:杭州
*/
@FormUrlEncoded
@POST("/9-2")
suspend fun getWeather(
@Field("area") area: String,
): CResponse
}
/**
* api接口实现类
*/
object WeatherRepository : Api {
/** 获取service */
private val service by lazy { RetrofitManager.getService(Api::class.java) }
/**
* 请求天气
* @param area 地址 eg:杭州
*/
override suspend fun getWeather(area: String): CResponse {
return service.getWeather(area)
}
}
/**
* viewModel
*/
class MainViewModel : BaseViewModel() {
/** 天气数据 */
var weatherData: MutableLiveData = MutableLiveData()
override fun start() {
}
/**
* 获取天气数据
*/
fun getWeather() {
viewModelScope.launch {
val result = WeatherRepository.getWeather("杭州")
weatherData.value = result.data.now
}
}
}
/**
* 主页
*/
class MainActivity : BaseActivity(R.layout.activity_main) {
override fun initView() {
}
override fun initData() {
getData()
}
/**
* 获取数据
*/
private fun getData() {
mViewModel.getWeather()
}
}
github.com/ElaineTaylo…
具体内容在 little_project 项目中
作者:木子闲集
链接:https://juejin.cn/post/7142775573385838606
附赠一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程
1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》
从一个膜拜大神的 Demo 开始
Kotlin 写 Gradle 脚本是一种什么体验?
Kotlin 编程的三重境界
Kotlin 高阶函数
Kotlin 泛型
Kotlin 扩展
Kotlin 委托
协程“不为人知”的调试技巧
图解协程:suspend
1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)
…
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓