改造中的呼叫或响应?

Asi*_*air 4 android kotlin android-studio retrofit2 kotlin-coroutines

我想知道 Call 和 Response 之间的区别?在 Retrofit 中何时使用Call和何时使用Response

@GET("/albums/{id}")
suspend fun functionOne(@Path(value = "id") albumsId:Int):Response<Albums>
@GET("/albums/{id}")
suspend fun functionTwo(@Path(value = "id") albumsId:Int):Call<Albums>
Run Code Online (Sandbox Code Playgroud)

这两个功能对我来说都很好,都有不同的实现,但目的几乎相同。

1. 什么样的响应类型有利于最佳实践?

2. 何时使用响应和呼叫?

小智 8

当我们愿意使用它的入队回调函数时,“调用”很有用。

 call.enqueue(new Callback<Info>() {
            @Override
            public void onResponse(Call<Info> call, Response<Info> response) {

                Info info = response.body();

                if (info != null && info.getRestResponse() != null) {

                    results = (ArrayList<Result>) info.getRestResponse().getResult();
                    viewData();
                }
            }

            @Override
            public void onFailure(Call<Info> call, Throwable t) {

            }
        });
Run Code Online (Sandbox Code Playgroud)

当我们在项目中使用 Coroutines 或 RxJava(这是最好的专业实践)提供异步执行时,我们不需要入队回调。我们可以只使用响应。

suspend fun getMoviesFromAPI(): List<Movie> {
        lateinit var movieList: List<Movie>
        try {
            val response = movieRemoteDatasource.getMovies()
            val body = response.body()
            if(body!=null){
                movieList = body.movies
            }
        } catch (exception: Exception) {
            Log.i("MyTag", exception.message.toString())
        }
        return movieList
    }  
Run Code Online (Sandbox Code Playgroud)


Pet*_*Học 6

1. 什么样的响应类型有利于最佳实践?

我认为这取决于您的用例。通过使用retrofit2.Response<T>,我们可以访问errorBody()(未成功响应的原始响应正文。)、code()(HTTP 状态代码。) 或headers()(HTTP 标头)。

2. 何时使用响应和呼叫?

  • 回复:如上
  • 调用:没有必要,因为回调类型(例如Call)被替换为suspend function。第二种方法可能更简单,例如:
@GET("/albums/{id}")
suspend fun functionTwo(@Path(value = "id") albumsId:Int): Albums
Run Code Online (Sandbox Code Playgroud)