电影资讯
- 电影资讯App是一个纯练手项目,使用了系统API28,全部是基于Androidx包下的。
- 使用Kotlin语言开发,MVVM架构思想,使用了Android JetPack中的LiveData、ViewModel、Room等架构组件。
- Api来自豆瓣电影,豆瓣电影Api目前是不公开的,小编是在简书上看到有人公开了访问豆瓣电影的Api的API_KEY,如果有侵犯,请联系删除!
项目截图
截图1 | 截图2 | 截图 3 | 截图 4 | 截图5 |
---|---|---|---|---|
5.jpg
|
3.jpg
|
1.jpg
|
4.jpg
|
6.jpg
|
app主要设计到知识点:
- Material Design UI设计风格;
- 使用Kotlin语言开发,MVVM软件架构设计,使用了Android JetPack中的LiveData、ViewModel、Room等AAC架构组件。
- 协程+okhttp+Retrofit封装网络请求;
- 自定义RecyclerView支持上拉刷新和下拉加载,并且使用装饰者设计模式添加不同类型头部和底部的View以及动画;
封装BaseViewModel,利用协程处理网络请求,处理异步任务。
open class BaseViewModel : ViewModel() {
val loadingLiveData = SingleLiveData<Boolean>()
val errorLiveData = SingleLiveData<Throwable>()
/**
* 利用协程处理网络请求,处理异步任务。
* block() 处理网络请求(Retrofit中对应的api接口方法)
* error() 处理网络请求发生错误
* complete() 网络请求完成之后调用
*/
fun launch(
block: suspend () -> Unit,
error: suspend (Throwable) -> Unit,
complete: suspend () -> Unit
) {
loadingLiveData.postValue(true)
viewModelScope.launch(Dispatchers.IO) {
try {
block()
} catch (e: Exception) {
error(e)
} finally {
complete()
}
}
}
}
电影模块ViewModel中的一个方法,请求电影详情,请求到数据封装到具体的LiveData中,View层去订阅数据。
/**
* 电影详情
* @param movieId 影片id
*/
fun getMovieInfo(movieId: String) {
launch({
val movieInfo = movieRepository.getMovieInfo(movieId, API_KEY)
movieInfoLiveData.postValue(movieInfo)
}, {
errorLiveData.postValue(it)
}, {
loadingLiveData.postValue(false)
})
}
项目地址:github传送门