0

I'm new on Retrofit+ RxJava. I wrote some app using Volley and nothing else. Now I'm trying to understand how Retrofit + RxJava work. I'm testing them calling some web service I used in Volley.

I read a lot about them and tried some example, but I can't understand how to solve the error.
Here I'm calling a JsonArray:

"items": [
        {
            "v_area": "A",
            "area": "filter (1)"
        },
        {
            "v_area": "C",
            "area": "rack (1)"
        },
        {
            "v_area": "2",
            "area": "Warehouse2 (1)"
        }
    ],


Process: com.ids.rxjavaretrofittest, PID: 6675
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ids.rxjavaretrofittest/com.ids.rxjavaretrofittest.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.Observable com.ids.rxjavaretrofittest.apiclient.ApiInterface.getArea(java.lang.String, java.lang.String)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7356)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
         Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.Observable com.ids.rxjavaretrofittest.apiclient.ApiInterface.getArea(java.lang.String, java.lang.String)' on a null object reference
            at com.ids.rxjavaretrofittest.MainActivity.onCreate(MainActivity.java:25)
            at android.app.Activity.performCreate(Activity.java:7802)
            at android.app.Activity.performCreate(Activity.java:7791)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
            at android.os.Handler.dispatchMessage(Handler.java:107) 
            at android.os.Looper.loop(Looper.java:214) 
            at android.app.ActivityThread.main(ActivityThread.java:7356) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

I found out this example. Fetch JSON data using retrofit and rxjava

Thi is my code:

 public interface ApiInterface {
    
    
    
        @GET("aree/getAree?")
        Observable<ResponseArea> getArea(@Query("p1") String code,
                                         @Query("p2") String param);
    }
    
    
    public class Area {

    @SerializedName("v_area")
    private String typeArea;

    @SerializedName("area")
    private String desArea;

    public String getTypeArea() {
        return typeArea;
    }

    public void setTypeArea(String typeArea) {
        this.typeArea = typeArea;
    }

    public String getDesArea() {
        return desArea;
    }

    public void setDesArea(String desArea) {
        this.desArea = desArea;
    }
}

public class ResponseArea {

    @SerializedName("items")
    private List<Area> areaList;

    public List<Area> getAreaList() {
        return areaList;
    }

    public void setAreaList(List<Area> areaList) {
        this.areaList = areaList;
    }
}

public class MainActivity extends AppCompatActivity {

    private ApiInterface apiInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Disposable disposable = apiInterface.getArea("4744",".")
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(this::handlerResponse,this::handlerError);

    }

    private void handlerResponse(ResponseArea responseArea) {
        Log.d("Response "," value responseArea "+responseArea);

    }

    private void handlerError(Throwable throwable) {
    }
}

Can anyone tell me where I was wrong?

My ApiCLient client where I manage the retrofil class: public class ApiClient {

public static final String HTTPS_PATH = "XXXXXXXX";
private static Retrofit retrofit = null;

public static Retrofit getClient() {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

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


    retrofit = new Retrofit.Builder()
            .baseUrl(HTTPS_PATH)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();



    return retrofit;
}

}

Scripta14
  • 463
  • 2
  • 8
  • 22
  • 1
    it seems you didn't initialize your Retrofit object. you can not use ApiInterface without initialize it by Retrofit – Hossein Shahmohammadi Feb 03 '23 at 18:43
  • Thanks I found out it yesterday, I forgot it. Now I have a question for you, I can't understand why handlerResponse return me a null value in responseArea. Oservable works fine and in the console I can see HTTP STATUS 200 and JsonArray values, but I can't print any values into the log – Scripta14 Feb 04 '23 at 09:08
  • Have you declared GsonConverterFactory when you are initializing your Retrofit Object? – Hossein Shahmohammadi Feb 06 '23 at 07:19
  • I updated my question. You can see how I manage the GsonConverterFactory. I'm new with Retrofit and surely I'm not managing in the right way it – Scripta14 Feb 06 '23 at 07:32
  • Thanks. I followed your suggestion and I found out this https://www.woolha.com/tutorials/retrofit-2-define-custom-gson-converter-factory and I solved it – Scripta14 Feb 06 '23 at 09:55

0 Answers0