在 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说的也对,不过我没有测试过,所以你也需要看看是不是有问题。
刚开始学习 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说的也对,不过我没有测试过,所以你也需要看看是不是有问题。