Browse Source

@task: use launch

bai 3 years ago
parent
commit
301dae70b3
1 changed files with 66 additions and 57 deletions
  1. 66 57
      demo/src/main/java/com/framework/mvvm/mv/AdmViewModel.kt

+ 66 - 57
demo/src/main/java/com/framework/mvvm/mv/AdmViewModel.kt

@@ -100,70 +100,79 @@ class AdmViewModel(private val repository: AdmRepository) : ViewModel() {
                 Log.d("downloadBuilding", "buildings is empty")
                 return@launch
             }
-            for (building in buildings) {
-                repository.requestBuilding(
-                    AdmRequest(
-                        userId = "bdtp",
-                        projectId = building.projectId!!,
-                        groupCode = building.groupCode!!,
-                        buildingId = if (isProject) "" else building.id,
-                        clientId = sp.getString(CLIENT_ID, "") ?: "",
-                        bdtpDownloadTs = sp.getLong(
-                            "${
-                                if (isProject)
-                                    building.projectId
-                                else
-                                    building.id
-                            }.$BDTP_TS",
-                            0L
-                        ),
-                        admDownloadTs = sp.getLong(
-                            "${
-                                if (isProject)
-                                    building.projectId
-                                else
-                                    building.id
-                            }.$ADM_TS",
-                            0L
-                        )
-                    )
-                ) {
-                    Log.e(
-                        "downloadBuilding",
-                        "bdtpDownloadTs:${it.bdtpDownloadTs}, admDownloadTs:${it.admDownloadTs}"
-                    )
-
-                    sp.edit {
-                        putLong(
-                            "${if (isProject) building.projectId else building.id}.$BDTP_TS",
-                            it.bdtpDownloadTs
-                        )
-                    }
-
-                    sp.edit {
-                        putLong(
-                            "${if (isProject) building.projectId else building.id}.$ADM_TS",
-                            it.admDownloadTs
-                        )
+            val job = launch { // 启动一个总协程
+                for (building in buildings) {
+                    launch {  // 为每个下载任务启动协程
+                        repository.requestBuilding(
+                            AdmRequest(
+                                userId = "bdtp",
+                                projectId = building.projectId!!,
+                                groupCode = building.groupCode!!,
+                                buildingId = if (isProject) "" else building.id,
+                                clientId = sp.getString(CLIENT_ID, "") ?: "",
+                                bdtpDownloadTs = sp.getLong(
+                                    "${
+                                        if (isProject)
+                                            building.projectId
+                                        else
+                                            building.id
+                                    }.$BDTP_TS",
+                                    0L
+                                ),
+                                admDownloadTs = sp.getLong(
+                                    "${
+                                        if (isProject)
+                                            building.projectId
+                                        else
+                                            building.id
+                                    }.$ADM_TS",
+                                    0L
+                                )
+                            )
+                        ) {
+                            Log.e(
+                                "downloadBuilding",
+                                "bdtpDownloadTs:${it.bdtpDownloadTs}, admDownloadTs:${it.admDownloadTs}"
+                            )
+
+                            sp.edit {
+                                putLong(
+                                    "${if (isProject) building.projectId else building.id}.$BDTP_TS",
+                                    it.bdtpDownloadTs
+                                )
+                            }
+
+                            sp.edit {
+                                putLong(
+                                    "${if (isProject) building.projectId else building.id}.$ADM_TS",
+                                    it.admDownloadTs
+                                )
+                            }
+                        }
                     }
                 }
             }
+            job.join()
 
             // 下载地图
-            val floors = repository.getFloors()
-            floors.forEach {
-                val json = it.infos?.asJsonObject
-                val floorMap = json?.get("floorMap")?.asString ?: ""
-                if (floorMap.isNotEmpty()) {
-                    val mapString = OkhttpUtil.getGzipMap("$IP$pathDownloadMap${floorMap}")
-                    val mapFile =
-                        File(DemoApp.getInstance()?.getExternalFilesDir("floorMap"), it.id)
-                    FileOutputStream(mapFile).use { output -> output.write(mapString.toByteArray()) }
-                    it.floorMap = mapFile.absolutePath
-                    repository.updateObject(it)
+            val gzipJob = launch {
+                val floors = repository.getFloors()
+                floors.forEach {
+                    launch(Dispatchers.IO) {
+                        val json = it.infos?.asJsonObject
+                        val floorMap = json?.get("floorMap")?.asString ?: ""
+                        if (floorMap.isNotEmpty()) {
+                            val mapString = OkhttpUtil.getGzipMap("$IP$pathDownloadMap${floorMap}")
+                            val mapFile =
+                                File(DemoApp.getInstance()?.getExternalFilesDir("floorMap"), it.id)
+                            FileOutputStream(mapFile).use { output -> output.write(mapString.toByteArray()) }
+                            it.floorMap = mapFile.absolutePath
+                            repository.updateObject(it)
+                        }
+                    }
                 }
             }
-
+            gzipJob.join()
             withContext(Dispatchers.Main) {
                 block?.invoke()
             }