【问题标题】:Should I use retrofit with a singleton?我应该对单例使用改造吗?
【发布时间】:2017-03-29 09:10:55
【问题描述】:

我是改装新手,想知道最佳做法是什么。

这是我在网上找到的一些抽象代码:

public class RestClient

{
    private static final String BASE_URL = "your base url";
    private ApiService apiService;

    public RestClient()
    {
        Gson gson = new GsonBuilder()
                .registerTypeAdapterFactory(new ItemTypeAdapterFactory()) // This is the important line ;)
                .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
                .create();

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(BASE_URL)
                .setConverter(new GsonConverter(gson))
                .setRequestInterceptor(new SessionRequestInterceptor())
                .build();

        apiService = restAdapter.create(ApiService.class);
    }

    public ApiService getApiService()
    {
        return apiService;
    }
}

假设我想使用此函数进行 api 请求/调用

RestClient restClient = new RestClient();
restClient.getApiService().getPosts();

我的问题是我应该创建一个新的 restClient 对象还是应该是单例,或者 ApiService 应该是单例。

最佳做法是什么?请记住,我不想使用依赖注入,我只想了解如何最好地使用改造。

你们中的一些人会怎么打这个电话?

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您应该以任何您喜欢的方式将RestClient 设为单例(枚举、标准getInstance() 甚至double check)。

    将它们保持为单例将提高性能,因为您不会每次都创建昂贵的对象,例如 GsonRestAdapterApiService

    编辑: Retrofit 可以同时处理的最大请求数取决于 HttpClient 配置。

    OkHttp 一起使用时,默认值为64(在Dispatcher 中定义)。

    但是它可以通过setMaxRequests() 进行操作,请记住不要产生太多线程(它可能导致 OutOfMemory)。

    【讨论】:

    • 嗨。我想知道,如果我不使用改造单例类,而是每次都创建新的改造实例怎么办。会造成什么问题?也许是内存泄漏或其他原因?
    【解决方案2】:

    您拥有的代码很好。您可以将 restClient 保留为单例,然后在您想再次获取帖子时调用restClient.getApiService().getPosts();(不要每次都创建新的 restClient)。

    【讨论】:

    • 如果是单例,能否并行处理两个或多个api请求?
    • 是的,它可以处理许多并行请求——我不确定限制是多少,但是当你超过这个限制时,它会将请求排队(假设你正在异步使用它,你应该)。我已经成功地连续快速地向它抛出了十几个或更多异步请求,而不必担心有多少未完成的请求。
    • 嗨。我想知道,如果我不使用改造单例类,而是每次都创建新的改造实例怎么办。会造成什么问题?也许是内存泄漏或其他原因?
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2017-06-12
    • 2023-04-04
    • 2013-06-28
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多