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;
}
}