feat:CPM微信小游戏“换一批”功能优化—客户端 https://jira.shanqu.cc/browse/GHZSCY-7168

This commit is contained in:
曾祥俊
2024-12-17 17:01:44 +08:00
committed by chenjuntao
parent c0fde44534
commit 2b9098faa7
2 changed files with 96 additions and 9 deletions

View File

@ -93,7 +93,12 @@ class CustomPageViewModel(
private var searchToolbarTabWrapperViewModel: SearchToolbarTabWrapperViewModel? = null
private val subjectChangedMap: ArrayMap<String, List<GameEntity>> = ArrayMap()
private val subjectChangedMap: ArrayMap<SubjectChanged, List<GameEntity>> = ArrayMap()
/**
* 微信CPM专题当前的页码记录
*/
private val cpmSubjectChangedPageMap: ArrayMap<String, Int> = ArrayMap()
var slideDiscoveryGamesPage = -1
@ -358,9 +363,68 @@ class CustomPageViewModel(
}
}
override fun onChangeABatch(subjectEntity: SubjectEntity) {
override fun onChangeABatch(subjectEntity: SubjectEntity) =
if (subjectEntity.isWechatColumnCPM) {
onChangeWGameCPMABatch(subjectEntity)
} else {
onChangeNormalGameABatch(subjectEntity)
}
/**
* 微信小游戏CPM的“换一批”功能实现
*
* @see <a href="https://jira.shanqu.cc/browse/GHZSCY-7167">【光环助手】CPM微信小游戏“换一批”功能优化</a>
*/
private fun onChangeWGameCPMABatch(subjectEntity: SubjectEntity) {
val subjectId = subjectEntity.id ?: return
val gameList = subjectChangedMap[subjectId]
val page = cpmSubjectChangedPageMap[subjectId] ?: let {
// 第一次点击“换一批”时,先缓存第一页的数据
subjectChangedMap[SubjectChanged(subjectId, 1)] = subjectEntity.data
2
}
val subjectChanged = SubjectChanged(subjectId, page)
val gameList = subjectChangedMap[subjectChanged]
if (gameList != null) {// 直接读取缓存数据
notifyWGameCPMABatchChanged(gameList, subjectId, page)
} else {
repository.loadChangeSubjectWGameCPM(page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<List<GameEntity>>() {
override fun onResponse(response: List<GameEntity>?) {
if (response != null) {
subjectChangedMap[subjectChanged] = response
notifyWGameCPMABatchChanged(response, subjectId, page)
}
}
override fun onFailure(e: HttpException?) {
Utils.toast(getApplication(), "网络异常")
}
})
}
}
private fun notifyWGameCPMABatchChanged(gameList: List<GameEntity>, subjectId: String, page: Int) {
val nextPage: Int
val cpmGameList = if(gameList.isEmpty()) {
nextPage = 1// 已经到最后一页了,下一页是第一页
subjectChangedMap[SubjectChanged(subjectId, 1)]!!
} else {
nextPage = page + 1
gameList
}
cpmSubjectChangedPageMap[subjectId] = nextPage// 加载下一页数据
changeSubjectCustomPageItem(subjectId, ArrayList(cpmGameList))
}
/**
* 光环游戏的“换一批”功能实现
*/
private fun onChangeNormalGameABatch(subjectEntity: SubjectEntity) {
val subjectId = subjectEntity.id ?: return
val subjectChanged = SubjectChanged(subjectId, 2)
val gameList = subjectChangedMap[subjectChanged]
if (gameList != null) {
changeSubjectCustomPageItem(subjectId, getRandomGameList(subjectEntity.data, ArrayList(gameList)))
} else {
@ -370,7 +434,7 @@ class CustomPageViewModel(
.subscribe(object : Response<List<GameEntity>>() {
override fun onResponse(response: List<GameEntity>?) {
if (response != null) {
subjectChangedMap[subjectId] = response
subjectChangedMap[subjectChanged] = response
onChangeABatch(subjectEntity)
}
}
@ -760,5 +824,26 @@ class CustomPageViewModel(
repository.onClear()
}
class SubjectChanged(
val subjectId: String,
val page: Int
) {
companion object {
private const val HASH = 30
}
override fun hashCode(): Int {
return subjectId.hashCode() + page.hashCode() + HASH
}
override fun equals(other: Any?): Boolean {
if (other !is SubjectChanged) {
return false
}
return other.subjectId == subjectId
&& other.page == page
}
}
}

View File

@ -805,11 +805,13 @@ class CustomPageRepository private constructor(
}
fun loadChangeSubjectGame(subjectEntity: SubjectEntity): Observable<List<GameEntity>> =
if (subjectEntity.isWechatColumnCPM) {// 微信小游戏CPM专题的“换一批”接口
wGameSubjectCPMRemoteDataSource.getEditorRecommendCPMList(2, 10).toObservable()
} else {
remoteDataSource.loadChangeSubjectGame(subjectEntity)
}
remoteDataSource.loadChangeSubjectGame(subjectEntity)
.map(RegionSettingHelper.filterGame)
.map(ApkActiveUtils.filterMapperList)
fun loadChangeSubjectWGameCPM(page: Int): Observable<MutableList<GameEntity>> =
wGameSubjectCPMRemoteDataSource.getEditorRecommendCPMList(page, 10)// 微信小游戏CPM专题的“换一批”接口
.toObservable()
.map(RegionSettingHelper.filterGame)
.map(ApkActiveUtils.filterMapperList)