【问题标题】:How can i reuse Retrofit code in Android如何在 Android 中重用 Retrofit 代码
【发布时间】:2018-01-01 08:29:13
【问题描述】:

以下代码是我目前如何使用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
        }
    });
}

我的情况是我必须fetchuserlist 中的多个activities。 所以我最终在每一个中都复制了getUserDetails() 方法。

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

我非常感谢任何能够为我指明正确方向的帮助。

【问题讨论】:

  • 是的,您可以使用将其移动到单独的类并重新使用它并对活动进行回调
  • 如果您的项目增长,那么也许是时候使用一些架构模式(如 MVP、MVVM)了。查看这个在 MVP 项目中使用改造的简单示例:Simple MVP Retrofit example
  • 我也建议您观看此视频youtube.com/watch?v=t34AQlblSeE。你不需要改造和改造Scr。欲了解更多信息,请观看视频
  • @Raghunandan 谢谢我发现这个链接非常有用。谢谢
  • 我不明白投反对票的原因,请有人指出。

标签: android retrofit code-reuse


【解决方案1】:

您可以传递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
    }
});

【讨论】:

  • 我觉得你的建议和我的代码没有太大区别,因为我们仍然需要在所有活动中重写 getUserDetails(new Callback..。
  • 对不起,我没有解释清楚,getUserDetails() 将是通用的,它只会写在一个class 上。
  • 请检查更新的代码,如果你不想回调(因为它仍然很大)我们可以添加一个自定义接口来处理列表响应。
【解决方案2】:

为此,您可以创建一个名为 GetListingUtility 的类,并将此方法放入此 GetListingUtility 类中。

例如:

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

【讨论】:

  • getUserDetails() 可能应该声明为public
  • @chandani c patel,如果我理解正确的话,'OnItemSelected' 是一个接口,带有方法 onItemSelected(Object kv)。这是正确的吗?
  • @chandani c patel 如果我将 getUserDetails() 更改为静态方法并直接传递上下文和接口,它会影响我的内存使用情况。
  • @Deepak 如果没有必要不要使用静态方法
猜你喜欢
  • 2018-10-08
  • 2020-11-14
  • 1970-01-01
  • 2016-11-18
  • 2021-12-12
  • 2019-06-15
  • 2011-05-05
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多