我正在尝试使用retro fit但是onResponse和onFailure不会被调用。我也没有任何例外。我很困惑,我做错了。如果你能发现一些东西,我们将不胜感激。
更新 - 我在OnResponse方法中得到空指针异常。
网址 - https://jsonplaceholder.typicode.com/posts/
API客户端
public class ApiClient {
public static final String BASE_URL_TWO = "https://jsonplaceholder.typicode.com/posts/";
public static Retrofit retrofit = null;
public static Retrofit getApiClient()
{
if(retrofit == null)
{
retrofit = new Retrofit.Builder().baseUrl(BASE_URL_TWO).
addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
}
ApiInterface
public interface ApiInterface {
@GET("/posts")
Call<List<DemoJSONAPIData>> getDemoData();
}
APICALLS
public class ApiCalls implements IApiCalls{
private ApiInterface apiInterface;
private List<DemoJSONAPIData> demoJSONAPIDatas;
@Override
public List<DemoJSONAPIData> getDemoData() {
try{
apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
Call<List<DemoJSONAPIData>> call = apiInterface.getDemoData();
call.enqueue(new Callback<List<DemoJSONAPIData>>() {
//Skips out of try catch, no exception being caught
@Override
public void onResponse(Call<List<DemoJSONAPIData>> call, Response<List<DemoJSONAPIData>> response) {
//UPDATE - I am getting NULL pointer here.
demoJSONAPIDatas = response.body();
Log.d("demoJSONAPIDatas", demoJSONAPIDatas.toString());
for(DemoJSONAPIData demoJSONAPIData: demoJSONAPIDatas){
Log.d("UserId", demoJSONAPIData.getId());
Log.d("Title", demoJSONAPIData.getTitle());
}
}
@Override
public void onFailure(Call<List<DemoJSONAPIData>> call, Throwable t) {
//IS not called
}
});
}catch (Exception e){
System.out.println("Error " + e.getMessage());
}
return demoJSONAPIDatas;
}
}
DemoJSONAPIData
public class DemoJSONAPIData {
@SerializedName("userId")
private String UserId;
@SerializedName("id")
private String Id;
@SerializedName("title")
private String Title;
@SerializedName("body")
private String Body;
public String getUserId() {
return UserId;
}
public String getId() {
return Id;
}
public String getTitle() {
return Title;
}
public String getBody() {
return Body;
}
}
像这样使用
List<DemoJSONAPIData> demoJSONAPIDatas = apiCalls.getDemoData();
请建议我做错了。
由于 [R
答案 0 :(得分:0)
那是因为Call.enqueue是异步。它在返回之前没有提出请求;它在另一个线程中启动请求并立即返回。返回时,demoJSONAPIDatas
仍然为空,因为还没有发生任何事情。所以这个
List<DemoJSONAPIData> demoJSONAPIDatas = apiCalls.getDemoData();
无效。
答案 1 :(得分:0)
问题出在你的ApiClient和interface.make下面的变化。
Baseurl需要改变如下
public class ApiClient {
public static final String BASE_URL_TWO = "https://jsonplaceholder.typicode.com/";
public static Retrofit retrofit = null;
public static Retrofit getApiClient()
{
if(retrofit == null)
{
retrofit = new Retrofit.Builder().baseUrl(BASE_URL_TWO).
addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
}
get()方法将改变
public interface ApiInterface {
@GET("posts")
Call<List<DemoJSONAPIData>> getDemoData();
}
<强>更新强>
private List<DemoJSONAPIData> demoJSONAPIDatas=new ArrayList<>();