#android #api #kotlin #kotlin-coroutines
#Android #API #kotlin #kotlin-сопрограммы
Вопрос:
Код MainActivity.kt
val r = Retrofit.Builder()
.baseUrl("https://reqres.in/api/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val api = r.create(ResqResAPI::class.java)
GlobalScope.launch(Dispatchers.IO) {
try {
val response = api.getUsers()
GlobalScope.launch(Dispatchers.Main) {
Toast.makeText(
this@MainActivity,
"Request Success",
Toast.LENGTH_SHORT
).show()
}
response.body()?.users?.let { printUsers(it) }
} catch (e: Exception) {
GlobalScope.launch(Dispatchers.Main){
Toast.makeText(
this@MainActivity,
"Request Failed",
Toast.LENGTH_SHORT
).show()
}
}
}
}
private fun printUsers(users: List<UserResponse.User>) {
val lvPeople=findViewById<ListView>(R.id.lvPeople)
lvPeople.adapter = ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
users.map { it.firstName }
)
}
}
UserInterface.kt
interface ResqResAPI {
@GET("users?")
suspend fun getUsers(
@Query("page")page:Int=1
):Response<UserResponse>
}
UserResponse.kt
@Keep
data class UserResponse(
@SerializedName("data") val users: List<User>,
@SerializedName("page") val page: Int,
@SerializedName("per_page") val perPage: Int,
@SerializedName("total") val total: Int,
@SerializedName("total_pages") val totalPages: Int
) {
@Keep
data class User(
@SerializedName("avatar") val avatar: String,
@SerializedName("email") val email: String,
@SerializedName("first_name") val firstName: String,
@SerializedName("id") val id: Int,
@SerializedName("last_name") val lastName:String
)
}
Этот код основан на сопрограммах, поэтому я хочу сохранить это без изменений
Когда я запускаю код в своем эмуляторе, он показывает сбой запроса.Каково решение этой проблемы?Я абсолютный новичок, поэтому не могли бы вы объяснить мне простыми словами
Ответ №1:
вы должны проверить свое разрешение в манифесте на использование Интернета или запроса по адресу. время выполнения… Перейдите в свое приложение manifest.xml:
<manifest xlmns:android...>
...
<uses-permission android:name="android.permission.INTERNET" />
<application ...
</manifest>
Возможно, вы захотите взглянуть на это:
https://developer.android.com/training/basics/network-ops/connecting?authuser=1
https://developer.android.com/training/permissions/requesting?hl=pt-br