【发布时间】:2015-09-07 05:16:00
【问题描述】:
我正在为我的应用程序使用Retrofit-2.0.0。现在我在网上找到的所有关于 Retrofit 的教程都是基于早期的Retrofit 并且那里没有Call<T> 接口。这是我第一次使用 Retrofit,我反复收到null object reference。这是我的网络模型界面
public interface TMovieDBService {
@GET("/movie")
Call<MovieResponse> getMovieResponse(@Query("sort_by") String sortKey,
@Query("api_key") String apiKey);
}
这是我的updateMovies() 函数,用于更新电影列表。
void updateMovies() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.themoviedb.org/3/discover")
.addConverterFactory(GsonConverterFactory.create())
.build();
String sortKey = "popularity.desc";
TMovieDBService service = retrofit.create(TMovieDBService.class);
Call<MovieResponse> call = service.getMovieResponse(sortKey, ApiKey.API_KEY);
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(Response<MovieResponse> response) {
Log.d(LOG_TAG, "Reached this place");
if (!response.isSuccess()) {
Log.d(LOG_TAG, "No Success");
}
mMovieList = response.body().getMovies(); // <- response is null here
// Log.d(LOG_TAG, "Couldn't not reach this place");
mMovieAdapter.notifyDataSetChanged();
Log.d(LOG_TAG, "Response returned by website is : " + response.code());
}
@Override
public void onFailure(Throwable t) {
// Toast for the moment
// Appropriate error handling code should be present here
Toast.makeText(getActivity(), "Failed !", Toast.LENGTH_LONG).show();
}
});
}
我不知道在 enqueue 函数中要实现什么。改造网站上很少有关于如何使用回调的说明。假设所有其他代码工作正常。这里MovieResponse 对象由movieDB API 返回,其中包含Movies 数组和一些额外信息。我以这样的方式实现它,这样一旦我从那里得到MovieResponse 的响应,我就可以使用getMovies() 提取它,这将返回一个电影列表。
当我运行时,我只是得到null object reference,因为response 为空。我试图搜索有关使用新 Retrofit-2.0.0 的教程,尤其是有关使用 enqueue 功能的教程,但我不走运。另外还有一个问题应该在哪里调用updateMovies()。我可以直接在mainactivity中调用它吗?改造是否会自动在后台线程上运行网络调用?
【问题讨论】:
-
github.com/square/retrofit/releases/tag/parent-2.0.0-beta1 ↑ 这是 beta 版本,所以我认为你应该改用 1.9.0 版本(最新的稳定版本)。
-
我也面临同样的问题。你有解决办法吗?