如何 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 从方法中进行改进同步调用。
要进行同步调用,请在主线程中创建一个新线程并从那里进行调用,不允许从主线程进行网络调用,因为它会阻塞线程。
我试图从 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 从方法中进行改进同步调用。
要进行同步调用,请在主线程中创建一个新线程并从那里进行调用,不允许从主线程进行网络调用,因为它会阻塞线程。