android - 无法从 Kotlin Android 中解析的 Json 数据中为 TextView 赋值
问题描述
我有 textView,我想在其中存储来自 API 的数据。以下是我的代码
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.TextView
import com.google.gson.GsonBuilder
import okhttp3.*
import java.io.IOException
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btnFindIp = findViewById<Button>(R.id.btnFindIp)
val txtIP = findViewById<TextView>(R.id.txtIP)
btnFindIp.setOnClickListener {
fetchJsonData()
}
} //onCreate Ends here
fun fetchJsonData() {
val url = "https://ipapi.co/json/"
val request = Request.Builder().url(url).build()
val httpClient = OkHttpClient()
val txtIP = findViewById<TextView>(R.id.txtIP)
httpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call?, e: IOException?) {
println("Failed to execute")
}
override fun onResponse(call: Call?, response: Response?) {
val body = response?.body()?.string()
val gson = GsonBuilder().create()
val ipData:Ip = gson.fromJson(body, Ip::class.java)
// txtIP.text = ipData.ip.toString()
println(ipData.country_name)
txtIP.text = ipData.ip
}
})
}
data class Ip(
val ip: String,
val city: String,
val region: String,
val region_code: Any,
val country: String,
val country_name: String,
val continent_code: String,
val in_eu: Boolean,
val postal: Any,
val latitude: Double,
val longitude: Double,
val timezone: Any,
val utc_offset: Any,
val country_calling_code: String,
val currency: String,
val languages: String,
val asn: String,
val org: String
)
}
我成功地从 API 获取数据并将其解析为 Data 类
println(ipData.country_name)
这给出了正确的输出,但是当我将数据类值分配给 txtIP.text = ipData.ip
没有发生任何事情时,我确信我错过了一些东西,因为我对 Android 和 Kotlin 都很陌生
任何帮助将不胜感激
解决方案
您不能从其他线程编辑 UI。由于OkHTTP的文档说:
回调的接收者可能会在另一个线程上使用响应正文。
您必须以这种方式设置文本:
runOnUiThread {txtIP.text = ipData.ip }
推荐阅读
- r - 如何在 R 编程中计算比例
- python - 如何确定哪个变量更接近 21?
- python - 为什么 pyplot 的直方图会给出两种不同的颜色?
- swift - UserDefaults 不会在应用程序关闭并重新打开后保存数据
- vba - For循环不过滤列中的每个单元格
- voyager - 无法使用 Voyager Laravel 在文本字段中传递用户 ID
- python-3.x - 如何将参数传递给屏幕类
- java - 创建'java.util.List'弗里达
- javascript - Mongoose - FindOne 和 Save 不起作用
- python - django 上的模型字段应该是其他模型的总和