空指针异常

时间:2017-11-22 17:00:13

标签: android retrofit retrofit2

我正在尝试使用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

2 个答案:

答案 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<>();