增加数据上传业务
This commit is contained in:
@@ -1,14 +1,12 @@
|
||||
package com.navinfo.omqs.http
|
||||
|
||||
import com.navinfo.omqs.bean.EvaluationInfo
|
||||
import com.navinfo.omqs.bean.OfflineMapCityBean
|
||||
import com.navinfo.omqs.bean.TaskBean
|
||||
import okhttp3.ResponseBody
|
||||
import retrofit2.Call
|
||||
import retrofit2.Response
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Header
|
||||
import retrofit2.http.Query
|
||||
import retrofit2.http.Streaming
|
||||
import retrofit2.http.Url
|
||||
import retrofit2.http.*
|
||||
|
||||
/**
|
||||
* retrofit2 网络请求接口
|
||||
@@ -58,6 +56,10 @@ interface RetrofitNetworkServiceAPI {
|
||||
@Query("evaluatorNo") evaluatorNo: String,
|
||||
): Response<DefaultTaskResponse<List<TaskBean>>>
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("/devcp/upload")
|
||||
fun postRequest(@Body listEvaluationInfo: List<EvaluationInfo>?): Call<ResponseBody>
|
||||
|
||||
/**
|
||||
* @FormUrlEncoded 请求格式注解,请求实体是一个From表单,每个键值对需要使用@Field注解
|
||||
@Field 请求参数注解,提交请求的表单字段,必须要添加,而且需要配合@FormUrlEncoded使用
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.navinfo.omqs.http.taskupload
|
||||
|
||||
import android.content.Context
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.Observer
|
||||
import com.navinfo.omqs.bean.TaskBean
|
||||
import com.navinfo.omqs.http.RetrofitNetworkServiceAPI
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
/**
|
||||
* 管理任务数据上传
|
||||
*/
|
||||
|
||||
class TaskUploadManager constructor(
|
||||
val netApi: RetrofitNetworkServiceAPI,
|
||||
) {
|
||||
|
||||
lateinit var context: Context
|
||||
|
||||
/**
|
||||
* 最多同时下载数量
|
||||
*/
|
||||
private val MAX_SCOPE = 1
|
||||
|
||||
/**
|
||||
* 存储有哪些城市需要下载的队列
|
||||
*/
|
||||
private val scopeMap: ConcurrentHashMap<Int, TaskUploadScope> by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
|
||||
ConcurrentHashMap<Int, TaskUploadScope>()
|
||||
}
|
||||
|
||||
/**
|
||||
* 存储正在下载的城市队列
|
||||
*/
|
||||
private val taskScopeMap: ConcurrentHashMap<Int, TaskUploadScope> by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
|
||||
ConcurrentHashMap<Int, TaskUploadScope>()
|
||||
}
|
||||
|
||||
fun init(context: Context) {
|
||||
this.context = context
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动下载任务
|
||||
* 请不要直接使用此方法启动下载任务,它是交由[OfflineMapDownloadScope]进行调用
|
||||
*/
|
||||
fun launchScope(scope: TaskUploadScope) {
|
||||
if (taskScopeMap.size >= MAX_SCOPE) {
|
||||
return
|
||||
}
|
||||
if (taskScopeMap.contains(scope.taskBean.id)) {
|
||||
return
|
||||
}
|
||||
taskScopeMap[scope.taskBean.id] = scope
|
||||
scope.launch()
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动下一个任务,如果有正在等待中的任务的话
|
||||
* 请不要直接使用此方法启动下载任务,它是交由[OfflineMapDownloadScope]进行调用
|
||||
* @param previousUrl 上一个下载任务的下载连接
|
||||
*/
|
||||
fun launchNext(id: Int) {
|
||||
taskScopeMap.remove(id)
|
||||
for (entrySet in scopeMap) {
|
||||
val uploadScope = entrySet.value
|
||||
if (uploadScope.isNotSync()) {
|
||||
launchScope(uploadScope)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将下载任务加入到协程作用域的下载队列里
|
||||
* 请求一个下载任务[OfflineMapDownloadScope]
|
||||
* 这是创建[OfflineMapDownloadScope]的唯一途径,请不要通过其他方式创建[OfflineMapDownloadScope]
|
||||
*/
|
||||
fun start(id: Int) {
|
||||
scopeMap[id]?.start()
|
||||
}
|
||||
|
||||
|
||||
fun addTask(taskBean: TaskBean) {
|
||||
if (!scopeMap.containsKey(taskBean.id)) {
|
||||
scopeMap[taskBean.id] = TaskUploadScope( this, taskBean)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun observer(
|
||||
id: Int, lifecycleOwner: LifecycleOwner, observer: Observer<TaskBean>
|
||||
) {
|
||||
if (scopeMap.containsKey(id)) {
|
||||
scopeMap[id]!!.observer(lifecycleOwner, observer)
|
||||
}
|
||||
}
|
||||
|
||||
fun removeObserver(id: Int) {
|
||||
if (scopeMap.containsKey(id)) {
|
||||
scopeMap[id]!!.removeObserver()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
package com.navinfo.omqs.http.taskupload
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.Observer
|
||||
import com.navinfo.collect.library.data.entity.QsRecordBean
|
||||
import com.navinfo.omqs.bean.EvaluationInfo
|
||||
import com.navinfo.omqs.bean.TaskBean
|
||||
import com.navinfo.omqs.tools.FileManager
|
||||
import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
|
||||
import io.realm.Realm
|
||||
import kotlinx.coroutines.*
|
||||
import okhttp3.ResponseBody
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import java.util.*
|
||||
|
||||
class TaskUploadScope(
|
||||
private val uploadManager: TaskUploadManager,
|
||||
val taskBean: TaskBean,
|
||||
) :
|
||||
CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("OfflineMapUpLoad")) {
|
||||
|
||||
|
||||
/**
|
||||
*下载任务,用来取消的
|
||||
*/
|
||||
private var uploadJob: Job? = null
|
||||
|
||||
/**
|
||||
* 管理观察者,同时只有一个就行了
|
||||
*/
|
||||
private val observer = Observer<Any> {}
|
||||
// private var lifecycleOwner: LifecycleOwner? = null
|
||||
|
||||
/**
|
||||
*通知UI更新
|
||||
*/
|
||||
private val uploadData = MutableLiveData<TaskBean>()
|
||||
|
||||
init {
|
||||
uploadData.value = taskBean
|
||||
}
|
||||
|
||||
//改进的代码
|
||||
fun start() {
|
||||
change(FileDownloadStatus.WAITING)
|
||||
uploadManager.launchScope(this@TaskUploadScope)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 启动协程进行下载
|
||||
* 请不要尝试在外部调用此方法,那样会脱离[OfflineMapuploadManager]的管理
|
||||
*/
|
||||
fun launch() {
|
||||
uploadJob = launch() {
|
||||
upload()
|
||||
uploadManager.launchNext(taskBean.id)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 更新状态
|
||||
* @param status [OfflineMapCityBean.Status]
|
||||
*/
|
||||
private fun change(status: Int, message: String = "") {
|
||||
if (taskBean.syncStatus != status ) {
|
||||
uploadData.postValue(taskBean)
|
||||
launch {
|
||||
val realm = Realm.getDefaultInstance()
|
||||
realm.executeTransaction {
|
||||
it.copyToRealmOrUpdate(taskBean)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否未上传
|
||||
*/
|
||||
fun isNotSync(): Boolean {
|
||||
return taskBean.syncStatus == FileManager.Companion.FileUploadStatus.NONE
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加下载任务观察者
|
||||
*/
|
||||
fun observer(owner: LifecycleOwner, ob: Observer<TaskBean>) {
|
||||
removeObserver()
|
||||
uploadData.observe(owner, ob)
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传文件
|
||||
*/
|
||||
private suspend fun upload() {
|
||||
try {
|
||||
//如果已上传则返回
|
||||
if (taskBean.syncStatus == FileManager.Companion.FileUploadStatus.DONE) {
|
||||
return
|
||||
}
|
||||
|
||||
val realm = Realm.getDefaultInstance()
|
||||
taskBean.hadLinkDvoList.forEach {
|
||||
val list = realm.where(QsRecordBean::class.java).equalTo("linkId", it.linkPid).findAll()
|
||||
}
|
||||
|
||||
val list: MutableList<EvaluationInfo> = ArrayList()
|
||||
val evaluationInfo = EvaluationInfo(taskBean.id.toString(),
|
||||
"123123",
|
||||
"原库",
|
||||
"123123",
|
||||
"",
|
||||
"POINT (116.252097 40.00752)",
|
||||
"点限速",
|
||||
"多余",
|
||||
"多余",
|
||||
"多余",
|
||||
"多余",
|
||||
"多余",
|
||||
"张三",
|
||||
"20230426")
|
||||
|
||||
list.add(evaluationInfo)
|
||||
|
||||
//3. Create an instance of the interface:
|
||||
val apiService = uploadManager.netApi.postRequest(list).enqueue(object :
|
||||
Callback<ResponseBody> {
|
||||
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
|
||||
// handle the response
|
||||
Log.e("qj","")
|
||||
change(FileManager.Companion.FileUploadStatus.NONE)
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
|
||||
// handle the failure
|
||||
Log.e("qj","")
|
||||
change(FileManager.Companion.FileUploadStatus.ERROR)
|
||||
}
|
||||
})
|
||||
|
||||
} catch (e: Throwable) {
|
||||
change(FileManager.Companion.FileUploadStatus.ERROR)
|
||||
Log.e("jingo","数据上传出错 ${e.message}")
|
||||
} finally {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun removeObserver() {
|
||||
uploadData.observeForever(observer)
|
||||
uploadData.removeObserver(observer)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user