增加离线地图下载流程

This commit is contained in:
squallzhjch
2023-03-30 16:08:36 +08:00
parent 3a80a4ee5d
commit ca1be58db2
11 changed files with 308 additions and 27 deletions

View File

@@ -0,0 +1,48 @@
package com.navinfo.omqs.http.offlinemapdownload
import android.content.Context
import android.os.Environment
import android.text.TextUtils
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.OfflineMapCityBean
import dagger.hilt.android.qualifiers.ActivityContext
import java.io.Serializable
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
/**
* 管理离线地图下载
*/
class OfflineMapDownloadManager @Inject constructor(@ActivityContext context: Context) {
/**
* 最多同时下载数量
*/
private val MAX_SCOPE = 5
/**
* 存储有哪些城市需要下载
*/
private val scopeMap: ConcurrentHashMap<String, OfflineMapDownloadScope> by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
ConcurrentHashMap<String, OfflineMapDownloadScope>()
}
val downloadFolder: String? by lazy {
Constant.MAP_PATH + "/offline/"
}
/**
* 请求一个下载任务[OfflineMapDownloadScope]
* 这是创建[OfflineMapDownloadScope]的唯一途径,请不要通过其他方式创建[OfflineMapDownloadScope]
*/
fun request(cityBean: OfflineMapCityBean): OfflineMapDownloadScope? {
//没有下载连接的不能下载
if (TextUtils.isEmpty(cityBean.url)) return null
// if(scopeMap.containsKey())
var downloadScope = scopeMap[cityBean.id]
if (downloadScope == null) {
scopeMap[cityBean.id] = OfflineMapDownloadScope(cityBean)
}
return downloadScope
}
}

View File

@@ -0,0 +1,26 @@
package com.navinfo.omqs.http.offlinemapdownload
import androidx.lifecycle.MutableLiveData
import com.navinfo.omqs.bean.OfflineMapCityBean
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlin.coroutines.EmptyCoroutineContext
/**
* 代表一个下载任务
* [OfflineMapCityBean.id]将做为下载任务的唯一标识
* 不要直接在外部直接创建此对象,那样就可能无法统一管理下载任务,请通过[OfflineMapDownloadManager.download]获取此对象
* 这是一个协程作用域,
* EmptyCoroutineContext 表示一个不包含任何元素的协程上下文,它通常用于创建新的协程上下文,或者作为协程上下文的基础。
*/
class OfflineMapDownloadScope(cityBean: OfflineMapCityBean) : CoroutineScope by CoroutineScope(EmptyCoroutineContext) {
/**
*
*/
private var downloadJob: Job? = null
/**
*
*/
private val downloadData = MutableLiveData<OfflineMapCityBean>()
}