如何使用异步HTTP使用燃料获得响应的body



我有以下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);
        }
       }

最新更新