如何使用带有Fuel的异步HTTP GET获取响应的主体

时间:2019-06-27 18:20:35

标签: android asynchronous kotlin get fuel

我使用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

我如何正确获取消息?

1 个答案:

答案 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);
        }
       }