在 Kotlin 助手中使用 okhttp 进行简单的获取请求 class

Using okhttp for simple get request in Kotlin helper class

刚开始学习 Kotlin。我正在尝试使用 okhttp 向仅包含文本的 URL 发送一个简单的获取请求。

我想将请求的输出存储在 liveData 变量中,但是当我 运行 它时,它崩溃了。这是 class:

// gradle dependency added to build.gradle:
// implementation("com.squareup.okhttp3:okhttp:4.5.0")
//
// added this permission to AndroidManifest.xml just above the "application" section
// <uses-permission android:name="android.permission.INTERNET" />
//

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.IOException



class GetExample {
    private val client = OkHttpClient()
    private val _theResult = MutableLiveData<String?>()
    val theResult: LiveData<String?> = _theResult
   

    @Throws(IOException::class)
    fun getText(url: String) {
        val request = Request.Builder().url(url).build()
        try {
            client.newCall(request).execute()
                .use { response -> _theResult.value = response.body?.string() }
        } catch (e: IOException) {
            _theResult.value = e.message
        }
    }
}

我正在使用

来称呼它
val url = "https://raw.github.com/square/okhttp/master/README.md"
GetExample().getText(url)

并使用

访问结果
var thisString: String? = GetExample().theResult.value

非常感谢帮助

您正在尝试在 UI 线程上执行此操作。这是行不通的。 尝试在另一个线程上 运行 它,比如 IO 线程, 并在 liveData 中使用 postValue。否则,您需要在 UI 线程上设置值。

例如,

try {
    runBlocking(IO) {
        client.newCall(request).execute()
            .use { response -> _theResult.postValue(response.body?.string()) }
    }
} catch (e: IOException) {
    _theResult.value = e.message
}

让我们分解一下您的代码的作用,好吗?

val url = "https://raw.github.com/square/okhttp/master/README.md"
GetExample().getText(url)

var thisString: String? = GetExample().theResult.value 

您首先将 url 变量指定为 github link。然后,您构造一个新的 GetExample 对象并使用 url 参数对其调用 getText。 但是现在,您将 thisString 分配给 GetExample 的 new 实例,这意味着它不包含您调用 getText 的对象的数据。

要解决这个问题,可以这样写:

val url = "https://raw.github.com/square/okhttp/master/README.md"
val getter = GetExample()
getter.getText(url)

var thisString: String? = getter.theResult.value 

george说的也对,不过我没有测试过,所以你也需要看看是不是有问题。