我使用Fuel进行以下HTTP GET调用:
uri.httpGet().responseObject<Array<Data>> { _, response, result ->
result.fold(success = {
getSuccessMessage()
}, failure = {
val msg = "Error: ${it.message}"
val errorData = response.data.toString() //always throws Exception
})
当我接到未经授权的呼叫(返回状态代码401 )时,我需要具有响应正文。
当我使用异步方式时,我learned 请求是在专用线程池上完成的。
不幸的是,当我尝试读取响应时,总是会收到android.os.NetworkOnMainThreadException
。
我如何正确获取消息?
答案 0 :(得分:0)
对于网络上的主线程异常,这是基于协程的解决方案。它也处理网络调用中的错误。
在您的ApiService.kt
文件中,具有如下包装函数。
class ApiService {
suspend fun getAsyncWay(url: String): Any? {
return withContext(Dispatchers.IO) {
val (request, response, result) = Fuel.get(url)
.header("Accept", "application/json")
.responseString()
when (result) {
is Result.Failure -> {
println("Inside the Fuel Failure result ${String(response.data)}")
return@withContext String(response.data)
}
is Result.Success -> {
val data = result.get()
println("Inside the Fuel Data Success result $data") // you can also use ${String(response.data)
return@withContext data // response.statusCode is also available if we need to go that path.
}
}
}
}
}
然后在您的activity
中,您可以调用类似这样的URL。
val job = Job()
val ioScope = CoroutineScope(Dispatchers.IO + job)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ioScope.launch {
val url ='http://github.com/commits/blah'
val commitsList = ApiService().getAsyncWay(url)
println("commitsList list in the coroutine $commitsList")
textView.setText(commitsList);
}
}