我正在使用改造库来为我的应用程序执行API调用。我为API编写了一个单独的函数,以便它可以重用。我要回复的回应是对象'电影'的列表。但我无法返回对象。我该怎么办?
从API
获取数据的函数 // These are the retrofit codes to get the data from TMDB API
private List<Movies> getDataFromServer(int page)
{
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<Response> call = apiService.getPopularMovies(API_KEY , page);
List<Movies> movies = new ArrayList<>();
call.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
movies = response.body().getMovies();
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
Log.e(TAG,t.toString());
movies = null;
}
});
return movies;
}
它说我应该宣布电影是最终的,但是当我这样做时,它会自动将数组列表转换为数组,而onResponse和onFailure中的电影则转换为moviess [0]。我只是想拍电影,然后将其作为列表返回
答案 0 :(得分:1)
您可以将电影列表声明为班级中的字段,然后写下以下内容:
private List<Movies> getDataFromServer(int page)
{
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<Response> call = apiService.getPopularMovies(API_KEY , page);
call.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
if (response.isSuccessful()) {
movies = response.body().getMovies(); }
else{
//show error
}
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
Log.e(TAG,t.toString());
movies = null;
}
});
return movies;
}
还要记得检查您的回复是否成功。
答案 1 :(得分:0)
我认为你正在使用android studio的功能将修改器更改为final但它不能按你的意愿工作并更改电影修饰符ti final不会修复你的问题,因为你在另一个线程中获取数据而你只是返回null。你可以在获取数据时声明一个方法来调用,然后用它做你想做的事情
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var dups = xmlDoc.FirstChild.ChildNodes
.Cast<XmlNode>()
.Where(n=>n.Attributes.Count>0)
.GroupBy(n => n.Attributes["EmailID"].Value)
.Where(g => g.Count() > 1)
.SelectMany(g => g.ToList())
.ToList();
答案 2 :(得分:0)
问题是你从onResponse调用这是一个回调方法,并且需要时间来加载数据并将它们加载到你的电影列表中。你永远不会知道响应何时成为接收者,因此返回是不是一个好主意。你应该继续在onResponse()内部做任何事情。
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
if (response.isSuccessful()) {
movies = response.body().getMovies();
//continue whatever you want do from here when the response is received.
}
}