我如何在 Android 中重用 Retrofit 代码

How can i reuse Retrofit code in Android

以下代码是我目前使用的方式 Retrofit

Interface
**********

public interface LeafAPI
{

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC);
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
            .addInterceptor(logging)
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ConstantValues.BaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .client(httpClient.build())
            .build();

    Retrofit retrofitScr = new Retrofit.Builder()
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(ConstantValues.BaseUrl)
            .build();


    @GET("someController/serviceName")
    Call<ArrayList<UserDetails>> getUserList();
}

Activity中的用法:

private void getUserDetails() 
{
    ServiceAPI api = ServiceAPI.retrofit.create(ServiceAPI.class);
    Call<ArrayList<UserDetails>> call=api.getUserList();
    call.enqueue(new Callback<ArrayList<UserDetails>>() {
        @Override
        public void onResponse(Call<ArrayList<UserDetails>> call, retrofit2.Response<ArrayList<UserDetails>> response) {
            //Process the result and display in the UI  
        }

        @Override
        public void onFailure(Call<ArrayList<UserDetails>> call, Throwable t) {
            //Display Error Message
        }
    });
}

我的情况是,我必须 fetch userlistactivities。 所以我最终在每个方法中都复制了 getUserDetails() 方法。

我想知道是否可以将 getUserDetails 移动到单独的 Class 然后从那里重新使用它。我环顾四周,但 retrofit 上的所有示例都与我在上面放置的内容类似。

如果能为我指明正确的方向,我将不胜感激。

为此你可以做的是制作一个名为 GetListingUtility 的 class 并将此方法放入此 GetListingUtility class.

例如:

public class GetListingUtility{

Context context;
OnItemSelected onItemSelected;

public GetListingUtility(Context context, OnItemSelected onItemSelected) {
    this.context = context;
    this.onItemSelected = onItemSelected;
}

 private void getUserDetails() 
{
    ServiceAPI api = ServiceAPI.retrofit.create(ServiceAPI.class);
    Call<ArrayList<UserDetails>> call=api.getUserList();
    call.enqueue(new Callback<ArrayList<UserDetails>>() {
        @Override
        public void onResponse(Call<ArrayList<UserDetails>> call, retrofit2.Response<ArrayList<UserDetails>> response) {
            //Process the result and display in the UI  
        }

        @Override
        public void onFailure(Call<ArrayList<UserDetails>> call, Throwable t) {
            //Display Error Message
        }
    });
}

}

然后你可以这样调用这个方法:

private void callGetCountriesWS() {
    GetListingUtility utility = new GetListingUtility(getActivity(), new OnItemSelected() {
        @Override
        public void onItemSelected(Object kv) {
            // your stuff you want to do
        }
    });
    utility.getUserDetails();
}

您可以通过 callback 本身在 Activity 上处理它:

public class ApiCalls {
   public static void getUserDetails(Callback<ArrayList<UserDetails>> callback) {
       ServiceAPI api = ServiceAPI.retrofit.create(ServiceAPI.class);
       Call<ArrayList<UserDetails>> call=api.getUserList();
       call.enqueue(callback);
   }
}

在你的 Activity 上:

ApiCalls.getUserDetails(new Callback<ArrayList<UserDetails>>() {
    @Override
    public void onResponse(Call<ArrayList<UserDetails>> call, retrofit2.Response<ArrayList<UserDetails>> response) {
        //now you can  handle it on your activity, yey.
    }

    @Override
    public void onFailure(Call<ArrayList<UserDetails>> call, Throwable t) {
        //Display Error Message
    }
});