называть дооснащение в разных классах - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в android. Я использую Retrofit для вызова API. Но я хотел бы написать метод вызова модификации только один раз и использовать одну и ту же функцию в разных вызовах API в моем приложении. Я пытаюсь создать Это обобщенный c метод в классе неактивности и использую его в своем классе активности.

public static generic_Retrofit_Class apiClient;
private Retrofit retrofit = null;

public static generic_Retrofit_Class getInstance() {
    if (apiClient == null) {
        apiClient = new generic_Retrofit_Class();
    }
    return apiClient;
}


public Retrofit getclient()
{
    return getclient(null);
}

private Retrofit getclient(Object o) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.level(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder();
    okHttpClient.readTimeout(60, TimeUnit.SECONDS);
    okHttpClient.writeTimeout(60, TimeUnit.SECONDS);
    okHttpClient.connectTimeout(60, TimeUnit.SECONDS);
    okHttpClient.addInterceptor(interceptor);
    okHttpClient.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            return chain.proceed(request);
        }
    });

    retrofit = new Retrofit.Builder()
            .baseUrl(Constant.Baseurl)
            .client(okHttpClient.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    return retrofit;
}

После этого кода, когда я вызываю этот метод в своем классе Activity, он показывает ошибку. Вот реализация метода в классе Activity.

private void Getstock() {
    final String mid = medicineid.getText().toString().trim();
    final String batch = batchno.getText().toString().trim();

    if (medicineid.getText().length() != 0 && batchno.getText().length() != 0) {
        App_Interfaces app_interfaces = (App_Interfaces) new generic_Retrofit_Class().getclient().create(App_Interfaces.class);
        Map<String, String> mapdata = new HashMap<>();
        mapdata.put("mid", mid);
        mapdata.put("batch", batch);
        final Call<Response> getstock_call = app_interfaces.getstock(mapdata);

        getstock_call.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, Response<Response> response) {
                if (response.isSuccessful() && response.body() != null && response != null) {
                    String jsonresponse = response.body().toString();
                    parseStockData(jsonresponse);
                    System.out.print(jsonresponse);
                    return;
                }


            }

            @Override
            public void onFailure(Call<Response> call, Throwable t) {

            }
        });
    }

Вот ошибка

java .lang.IllegalArgumentException: retrofit2.Response не является допустимым типом тела ответа. Вы имели в виду ResponseBody? для метода App_Interfaces.getstock

вот мой код интерфейса

public interface get_stock 
   {
        @GET("/getstock")
        Call<Response> getstock(@QueryMap Map<String, String> options);
   }

1 Ответ

0 голосов
/ 09 апреля 2020

Добро пожаловать в SO

Измените код метода getClient на

public class YOUR_CLASS{

   private static YOUR_API_INTERFACE  retrofit = null;

   public static YOUR_API_INTERFACE getClient() { // no need to pass the object params

     if(retrofit == null){

         //you client code same as you written in question

         retrofit = new Retrofit.Builder()
                     .baseUrl(Constant.Baseurl)
                     .client(okHttpClient.build()) //okHtttpClient from your client code
                     .addConverterFactory(GsonConverterFactory.create())
                     .build();

      }
      return retrofit.create(YOUR_API_INTERFACE.class);
   }
}

Теперь вы можете легко получить доступ к интерфейсу модифицированного API с помощью YOUR_CLASS.getClient(). Это вернет ваш Интерфейс Retrofit

Ваш Интерфейс Retrofit с методом объявления должен быть таким:

public interface YOUR_API_INTERFACE {
   @GET("your api name")
   Call<YOUR_POJO> yourApi();
}

В вашем классе деятельности / фрагмента вы можете получить доступ к методу yourApi как

YOUR_CLASS.getClient().yourApi();
...