如何 url 通过改造从列表函数调用 return

how to url calling return from list function with retrofit

我试图从 url 中 return 列出我通过改装获得的列表。它有效,我得到了数据,但它不会 return.

这是我的代码

public List<MovieResponse> loadCourses() {
    ArrayList<MovieResponse> list = new ArrayList<>();

    ApiServices apiService =
            NetworkClient.getRetrofitClient().create(ApiServices.class);

    Call<MovieResult> call = apiService.getMovies();
    call.enqueue(new Callback<MovieResult>() {
        @Override
        public void onResponse(Call<MovieResult> call, Response<MovieResult> response) {
            if (response.body() != null) {
                ArrayList<MovieResponse> movies = new ArrayList<>();
                movies = response.body().getResults();
                Log.d("",""+movies);
                list.addAll(movies);
                Log.d("",""+list);
            }
        }

        @Override
        public void onFailure(Call<MovieResult> call, Throwable t) {
            // Log error here since request failed
            Log.e("error", t.toString());
        }
    });
     return list;
}

当我在 onResponse 中打印列表时,它可以工作并且有数据。但是当我 return 它或试图在 onResponse 之外打印列表时,例如下面 ArrayList<MovieResponse> list = new ArrayList<>(); 它不显示数据。

请帮助它到底出了什么问题。非常感谢。

最简单的方法是直接在 activity 或片段(换句话说,class 的字段成员)中定义 movies 列表。

return 来自异步方法的数据不是一个好主意。 将loadCourses方法的return类型改为void,实例化onResponse().

里面的字段movies
public class SomeActivity extends AppCompatActivity {

   private ArrayList<MovieResponse> movies = new ArrayList<>();

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_some);
   }

   public void loadCourses() {
       ApiServices apiService =
               NetworkClient.getRetrofitClient().create(ApiServices.class);

       Call<MovieResult> call = apiService.getMovies();
       call.enqueue(new Callback<MovieResult>() {
           @Override
           public void onResponse(Call<MovieResult> call, Response<MovieResult> response) {
            if (response.body() != null) {
                movies = response.body().getResults();
                ...
            }
        }

        @Override
        public void onFailure(Call<MovieResult> call, Throwable t) {
            ...
        }
    });
}

}

这是因为您正在进行由单独线程处理的异步调用。所以在 call.enqueue() 之后,主线程直接跳转到 return 语句而不等待 API 响应,这就是你得到空列表的原因。

假设您的 API 需要 1 秒才能响应, 只是为了实验,您可以尝试在 return 语句之前添加 sleep() 3 秒,它应该 return 所有电影。

如果您必须 return 从方法中进行改进同步调用。

要进行同步调用,请在主线程中创建一个新线程并从那里进行调用,不允许从主线程进行网络调用,因为它会阻塞线程。