Skip to content

Commit 12f4e86

Browse files
committed
Fix updating view on non-UI thread
1 parent a34b898 commit 12f4e86

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ android {
1616
applicationId = "com.launium.mcping"
1717
minSdk = 21
1818
targetSdk = 34
19-
versionCode = 4
20-
versionName = "0.2.2"
19+
versionCode = 5
20+
versionName = "0.2.3"
2121
setProperty("archivesBaseName", "MCPing-$versionName")
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

app/src/main/java/com/launium/mcping/server/MinecraftResolver.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import io.ktor.utils.io.core.Input
1414
import io.ktor.utils.io.core.readShort
1515
import io.ktor.utils.io.core.readTextExactBytes
1616
import io.ktor.utils.io.core.readUShort
17+
import io.ktor.utils.io.errors.IOException
1718
import io.ktor.utils.io.streams.asInput
1819
import kotlinx.coroutines.Dispatchers
1920
import kotlinx.coroutines.GlobalScope
@@ -101,6 +102,7 @@ class MinecraftResolver(uri: String) {
101102
return results
102103
}
103104

105+
@OptIn(ExperimentalStdlibApi::class)
104106
@RequiresApi(Build.VERSION_CODES.Q)
105107
private suspend fun querySRVPlatform(serviceName: String) = withContext(Dispatchers.IO) {
106108
return@withContext suspendCoroutine { continuation ->
@@ -115,13 +117,19 @@ class MinecraftResolver(uri: String) {
115117

116118
override fun onAnswer(answer: ByteArray, rCode: Int) {
117119
when (rCode) {
118-
0 -> continuation.resume(
119-
parseSRVResponse(
120-
ByteArrayInputStream(answer).asInput(),
121-
serviceName,
122-
verifyTransactionID = false
120+
0 -> try {
121+
continuation.resume(
122+
parseSRVResponse(
123+
ByteArrayInputStream(answer).asInput(),
124+
serviceName,
125+
verifyTransactionID = false
126+
)
123127
)
124-
) // 0 stands for NO_ERROR
128+
} catch (e: Exception) {
129+
continuation.resumeWithException(IOException("Fail to parse SRV response: [00000000 ${
130+
answer.joinToString { it.toHexString() + " " }
131+
}]", e))
132+
} // 0 stands for NO_ERROR
125133

126134
3 -> continuation.resume(null) // NX_DOMAIN
127135

app/src/main/java/com/launium/mcping/ui/discovery/DiscoveryFragment.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import kotlinx.coroutines.Dispatchers
2525
import kotlinx.coroutines.joinAll
2626
import kotlinx.coroutines.launch
2727
import kotlinx.coroutines.sync.Semaphore
28-
import kotlinx.coroutines.withContext
2928
import java.net.URL
29+
import java.util.Locale
3030

3131
private const val SERVER_LIST_URL = "https://www.jsip.club/api/ajax.php?request=get_line_list"
3232

@@ -104,10 +104,11 @@ class DiscoveryFragment : Fragment(), SwipeRefreshLayout.OnRefreshListener {
104104
adapter.servers = (resultObject["data"] as JSONArray).map {
105105
val serverObject = it as JSONObject
106106
return@map MinecraftServer(
107-
serverObject["name"] as String, serverObject["address"] as String
107+
serverObject["name"] as String,
108+
(serverObject["address"] as String).lowercase(Locale.getDefault())
108109
)
109110
}
110-
withContext(Dispatchers.Main) {
111+
activity?.runOnUiThread {
111112
adapter.notifyDataSetChanged()
112113
}
113114
val semaphore = Semaphore(Preferences.maxConcurrentPings)
@@ -125,7 +126,9 @@ class DiscoveryFragment : Fragment(), SwipeRefreshLayout.OnRefreshListener {
125126
}
126127
semaphore.release()
127128
if (changed) {
128-
adapter.notifyItemChanged(i)
129+
activity?.runOnUiThread {
130+
adapter.notifyItemChanged(i)
131+
}
129132
}
130133
}
131134
}

app/src/main/java/com/launium/mcping/ui/home/HomeFragment.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ class HomeFragment : Fragment() {
5555
}
5656
lifecycleScope.launch(Dispatchers.IO) {
5757
adapter.updateServerList()
58-
binding.container.adapter = adapter
58+
activity?.runOnUiThread {
59+
binding.container.adapter = adapter
60+
}
5961
}
6062

6163
binding.swipeRefreshLayout.setOnRefreshListener {
@@ -75,7 +77,9 @@ class HomeFragment : Fragment() {
7577
}
7678
semaphore.release()
7779
if (changed) {
78-
adapter.notifyItemChanged(i)
80+
activity?.runOnUiThread {
81+
adapter.notifyItemChanged(i)
82+
}
7983
ServerManager.serverDao.update(server)
8084
}
8185
}

0 commit comments

Comments
 (0)