我也玩Android
时间过的飞快,蓦然回首,发现自己做Android开发也好久了,坐在电脑前发呆两小时后,再不做点什么真的对不起自己的发际线,好了老铁们,那我就从现在开始吧!
2.jpg
项目简介
3.jpgwan01_状态 1(1).png
Android的技术在不断更新,我也结合当前的技术把之前的代码回炉重造,符合主流市场app的技术,我就简单哔哔几句项目架构:
Retrofit + ARouter + 组件化 + Jetpack + pagging3 + MVVM + 协程 + Koin + Coil
项目仓库WanApk
如果此项目对你有帮助和价值,烦请给个star,或者有什么好的建议或意见,也可以发个issues,感谢!
项目详情
1、如何独立运行一个Module?
我们只需要在根目录下gradle.properties
中添加一个singleModule
标志位,该标志位可以用来表示当前Module是否是独立模块,true
表示处于独立模块,可单独运行,false
则表示是一个library。
org.gradle.jvmargs=-Xmx2048m
android.useAndroidX=true
android.enableJetifier=true
#是否是需要单独运行某个模块
singleModule=true
#singleModule=false
在每个Module
的build.gradle
中加入singleModule
的判断,运行总App时,子Module是属于library
,而独立运行时,子Module是属于application
。配置如下:
if (singleModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
当然AndroidManifest
文件也同理,毕竟在singleModule
模式下每个可以独立运行的Module都要单独设置应用图标、名称、<intent-filter>等。
sourceSets{
main {
if (singleModule.toBoolean()) {
manifest.srcFile 'src/main/alone/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
编译运行后,桌面会出现多个应用图标,如下:(考虑到组件化的使用场景,就独立出一个跟app模块耦合性低的模块。玩库是为我另一个项目WanLibrary而作,主要对我封装的万能小控件做一些演示,其代码简单易懂)
那问题来了,组件间如何通信?
主要借助阿里的路由框架ARouter
2、Jetpack组件
2.1、Navigation
Navigation
是一个管理Fragment切换的组件,支持可视化处理。开发者也完全不用操心Fragment的切换逻辑。
在使用Navigation
的过程中,会出现点击back按键,界面会重新走了onCreate生命周期,并且将页面重构。目前比较好的解决方法是自定义NavHostFragment
,将内部replace替换为show/hide。
2.2、Paging3
Paging是一个分页组件,主要与Recyclerview结合分页加载数据。具体使用可参考首页
和项目
模块。
UI层:
class DailyQuestionFragment : BaseAppFragment<HomeFragmentDailyQuestionBinding>(
...
override fun lazyLoadData() {
lifecycleScope.launchWhenCreated {
viewModel.dailyQuestionPagingFlow().collectLatest {
pagingAdapter.submitData(it)
}
}
}
...
}
ViewModel层:
class DailyQuestionViewModel(
val repo: HomeRepo,
val personalRepo: PersonalRepo
) : BaseViewModel() {
...
/**
* 请求每日一问数据
*/
fun dailyQuestionPagingFlow(): Flow<PagingData<ArticleData>> =
repo.getDailyQuestion().cachedIn(viewModelScope)
...
}
Repository层
class HomeRepo : BaseRepository() {
...
/**
* 请求每日一问
*/
fun getDailyQuestion(): Flow<PagingData<ArticleData>> {
return Pager(config) {
DailyQuestionPagingSource(service)
}.flow
}
...
}
PagingSource层:
/**
* GitHub/Gitee:zhongya666 2021/7/8 9:41
* 每日一问数据源,主要配合Paging3进行数据请求与显示
*/
class DailyQuestionPagingSource(private val service: HomeApi) :
PagingSource<Int, ArticleData>() {
override fun getRefreshKey(state: PagingState<Int, ArticleData>): Int? = null
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ArticleData> {
return try {
val pageNum = params.key ?: 1
val data = service.getDailyQuestion(pageNum)
val preKey = if (pageNum > 1) pageNum - 1 else null
LoadResult.Page(data.data?.datas!!, prevKey = preKey, nextKey = pageNum + 1)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
版本
持续更新
下期会手写h5,嵌入到webview中,并实现Android与h5交互(混合开发)
感谢
付十一
API: 鸿洋大大提供的 WanAndroid API