【问题标题】:What makes retrofit faster than HttpUrlConnection + AsyncTask?是什么让改造比 HttpUrlConnection + AsyncTask 更快?
【发布时间】:2018-03-26 23:02:00
【问题描述】:

以下blog 给出了各种 Android Async Http 客户端的速度比较。谁能解释一下是什么让改造如此之快?

【问题讨论】:

    标签: android retrofit retrofit2


    【解决方案1】:

    编辑:再次浏览博客文章后,单线程与多线程问题可能不是真的。问题是他们没有分享他们的分析/基准测试的血腥细节。那一组数字并不能提供太多洞察力。他们说,“我们确定从 API(网络)检索数据是瓶颈”,但他们并没有把它分解太多。他们是否将所有 Volley 和 Retrofit 请求都设为单线程?他们是否尝试对他们的AsyncTasks 进行多线程处理,以便将苹果与苹果进行比较?他们没有具体说明。

    如果将响应解析为 JSONObject 会降低您的应用程序的速度,我采用的一种方法是使用 JSONReader 以事件驱动的方式解析响应。这可能涉及更多代码,但好处是您可以获得细粒度的控制,因此您可以跳过一些事情,而不会浪费循环解析您不关心的值。根据您的应用程序,仅此一项就可以大大加快速度。

    就个人而言,我发现他们声称 Retrofit 更易于使用是选择它来处理我的应用程序中的服务器访问的更有说服力的理由。


    来自“执行顺序”下的AsyncTask 文档:

    首次引入时,AsyncTask 是在单个后台线程上串行执行的。从DONUT 开始,这已更改为允许多个任务并行运行的线程池。从HONEYCOMB开始,任务在单线程上执行,避免并行执行导致的常见应用错误。

    如果你真的想要并行执行,你可以用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor, Object[])

    这意味着每个请求不仅在等待前一个请求完成,还等待其所有 JSON 被读取/解析。

    AsyncTask 默认是单线程的,而 Retrofit 不是。为了使测试公平,他们应该使用ThreadPoolExecutor 代替AsyncTasks。不指出这种区别几乎是虚伪的。我很惊讶他们不知道AsyncTask 的单线程性质。

    【讨论】:

    • 如果可能,请解释常见应用程序错误的含义
    • 最大的问题是乱序执行、竞争条件和死锁。 1) 想象一下,如果对请求 2 的响应在请求 1 之前完成。您的应用程序可能最终处于响应 1 中的数据覆盖响应 2 中的数据的状态,因此请求/响应 2 似乎从未发生过。 2) 如果响应非常紧密地发生在一起,您可能会出现竞争条件,其中响应 1 或响应 2 可能随机出现乱序,从而使错误难以调试。 3) 如果您的代码中有一些同步访问,则相关的可能性是死锁。
    • 我最近研究了这个。 @krislarson 的答案是正确的并且非常有帮助。从我的测试结果来看,一次只有 1 个 http 请求,大多数时候 Async+HttURLConnec 甚至比 Retrofit 还要快。
    • @krislarson 不知道你能不能帮我解决这个问题! stackoverflow.com/q/72255868/16436336
    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 2012-02-14
    • 1970-01-01
    • 2020-08-12
    • 2014-03-17
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多