增加数据上传业务

This commit is contained in:
qiji4215
2023-04-26 18:05:51 +08:00
parent a81e2f5d82
commit c5876c9713
12 changed files with 400 additions and 10 deletions

View File

@@ -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使用

View File

@@ -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()
}
}
}

View File

@@ -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)
}
}