只需在 Kotlin 的 Android 应用程序中检索公开发布在 HTTPS 上的 Json

问题描述 投票:0回答:1

我需要在公共网址上序列化以 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帖子,但对我一点帮助都没有。

android multithreading kotlin http url
1个回答
0
投票

也许是这样的:

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

	
© www.soinside.com 2019 - 2024. All rights reserved.