我需要在公共网址上序列化以 json 格式存储的一堆信息。
我知道我可以使用 java.net.URL() 来检索 Json,并且它可以工作。但我只能在非主线程上使用 URL(),否则 Android 会抛出
NetworkOnMainThreadException
。
我无法理解如何从线程内部提取 URL() 的结果。这是我现在结束的地方的模型:
fun getJsonFromUrl(myUrl: String): String {
var myJson: String = ""
thread {
myJson: URL = URL(myUrl).readText()
}.start()
return myJson
}
这总是返回一个空字符串,因为 return 语句是在线程实际完成(甚至可能启动)之前完成的。如何强制此函数在线程完成时返回值?或者,如果这是一个坏主意(我知道线程不应该让应用程序处于等待状态),那么如何使用 URL() 进行不同的操作呢? 我知道已经有很多关于这个问题的问题,但我没有找到任何可以正确回答这个问题的内容。我也知道有很多包可以管理 HTTP GET(Volley、OkHttp,...),但除了这个简单的连接之外,我不需要任何其他东西,而且我认为这些包不会帮助我理解如何在线程中工作。我尝试了很多东西,大部分是SO帖子,但对我一点帮助都没有。
也许是这样的:
class MainActivity : ComponentActivity() {
private var myJson: String = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
thread {
runOnUiThread {
myJson = URL("https://...").readText()
}
}.start()
否则使用 Kotlin 协程:
suspend fun getJsonFromUrl(myUrl: String): String {
return withContext(Dispatchers.IO) {
URL(myUrl).readText()
}
}
您可以在这里检索示例:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url = "https://api.example.com/data"
lifecycleScope.launch {
try {
val jsonResult = getJsonFromUrl(url)
...
}