Android Retrofit2回调返回null但已初始化

时间:2018-12-24 13:39:23

标签: java android nullpointerexception sharedpreferences retrofit2

我现在正在开发一个Android项目,并且正在尝试从URL进行解析。在我的“ ApiClient”中,我没有问题可以解析。这是我的“ ApiClient”类:

public class ApiClient implements Callback<Map<String, Channel>> {

    static final String BASE_URL = "someURL";

    public void start() {

        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        RestInterface restInterface = retrofit.create(RestInterface.class);

        Call<Map<String, Channel>> call = restInterface.getChannels();
        call.enqueue(this);

    }

    @Override
    public void onResponse(retrofit2.Call<Map<String, Channel>> call, Response<Map<String, Channel>> response) {
        System.out.println(response.code());
        if(response.isSuccessful()) {
            Map<String, Channel> body = response.body();
            List<Channel> channels = new ArrayList<>(body.values());
        }
...
    }

我正在尝试通过在“无线电”类中使用回调将响应添加到列表中。这是我的“无线电”课程:

public class Radio {
    private static final String STORAGE = "radio";
    private List<Channel> listChannels;

    public static Radio get() {
        return new Radio();
    }

    private SharedPreferences storage;

    private Radio() {
        storage = App.getInstance().getSharedPreferences(STORAGE, Context.MODE_PRIVATE);
    }

    public List<Channel> getData() {
        RestInterface restInterface = SingletonClass.getService();
        restInterface.getChannels().enqueue(new Callback<Map<String, Channel>>() {
            @Override
            public void onResponse(Call<Map<String, Channel>> call, Response<Map<String, Channel>> response) {
                if(response.isSuccessful()){
                    Map<String, Channel> body = response.body();
                    List<Channel> channels = new ArrayList<>(body.values());
                    loadChannels(channels);
                }
            }

            @Override
            public void onFailure(Call<Map<String, Channel>> call, Throwable t) {

            }
        });
        System.out.println(listChannels.get(1).getArtist());
        return listChannels;
    }

    public boolean isRated(int itemId) {
        return storage.getBoolean(String.valueOf(itemId), false);
    }

    public void setRated(int itemId, boolean isRated) {
        storage.edit().putBoolean(String.valueOf(itemId), isRated).apply();
    }

    private void loadChannels(List<Channel> channels){
        listChannels.clear();
        listChannels.addAll(channels);
    }


}

每当我运行程序时,我都会得到这个空指针异常:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.korhan.frontend, PID: 21028
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.korhan.frontend/com.example.korhan.frontend.SecondActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
        at com.example.korhan.frontend.Radio.getData(Radio.java:47)
        at com.example.korhan.frontend.SecondActivity.onCreate(SecondActivity.java:46)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

这是我的界面类:

public interface RestInterface {

    @GET("someURL")
    retrofit2.Call<Map<String, Channel>> getChannels();
}

和我的SingletonClass:

public class SingletonClass{

    private static final Retrofit RETROFIT = new Retrofit.Builder()
            .baseUrl(someURL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    private static final RestInterface SERVICE = RETROFIT.create(RestInterface.class);


    public static RestInterface getService(){
        return SERVICE;
    }

}

我现在不知道该怎么办才能在我的电台课程中填写列表。我完全愿意提出建议。感谢您的帮助。

0 个答案:

没有答案