我有以下HTTP使用燃料呼叫:
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 (时,我需要拥有响应主体。
当我使用 async方法时,我了解到这些请求是在专用的ThreadPool 上完成的。
不幸的是,当我尝试阅读响应时,我总是会得到android.os.NetworkOnMainThreadException
。
我该如何正确获取消息?
对于主线程异常上的网络,这是基于coroutine的解决方案。它还处理网络呼叫上的错误。
在您的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);
}
}