首先为语法错误道歉,
我正在尝试使用jsonurl中的信息创建用户。我可以获得所有信息,但当我试图在OnResponse中将其添加到我的列表中时,它不会添加。如果我从url获取数据,我会记录它,它会记录信息,所以获取信息没有问题。希望你能理解我的问题。这是我的代码
我的json文件
{"User":[{"name":"Kaan","number":"1"},{"name":"Ertürk","number":"2"}]}
我的用户数据类
data class User(var name: String, var Id:String)
这是我的UserService类和其中的一个函数,用于从json 中获取信息
fun getUser(url: URL) : MutableList<User>{
var userList = mutableListOf<User>()
var client =OkHttpClient()
var urlFun = url
var request = Request.Builder().url(urlFun).build()
client.newCall(request).enqueue(object: Callback{
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response){
if (response.isSuccessful){
var myResponse = response?.body?.string()
var jsonObject = JSONObject(myResponse)
var jsonArray = jsonObject.getJSONArray("User")
for (item in 0 until jsonArray.length()){
var user = jsonArray.getJSONObject(item)
var nameUser = user.getString("name")
var numberUser = user.getString("number")
Log.e("Created User: ", User(nameUser,numberUser).toString())
userList.add(User("$nameUser","$numberUser"))
}
}
}
})
userList.add(User("123","123"))
Log.e("UserServiceUserListSize" , userList.size.toString())
return userList
}
}
添加具有名称123的用户正在工作,并且userList大小为1。
我的主要活动
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setContentView(binding.root)
var url = URL("https://api.npoint.io/7f4353a444be404533f4")
var userService = UserService().getUser(url)
for (item in 0 until userService.size){
var userName = userService[item].name
var userId = userService[item].Id
binding.textView.append("Name: $userName , ID: $userId n")
}
}
}
队列调用的回调是异步执行的。因此,您的代码并没有达到您第一眼所期望的效果。函数onResponse()
将在函数getUser()
返回(因为它是同步执行的(后执行,这意味着binding.textView内容不会考虑它。
我不熟悉android(也不熟悉httpOk(,所以我不知道这是否是推荐的方法,但在我看来,最简单的解决方案是在onResponse部分中移动binding.textView.append("Name: $userName , ID: $userId n")
。
或者,您可以使用同步http GET,但这可能会阻塞您的UI,所以您很可能不希望这样。