【发布时间】:2018-03-26 23:02:00
【问题描述】:
以下blog 给出了各种 Android Async Http 客户端的速度比较。谁能解释一下是什么让改造如此之快?
【问题讨论】:
标签: android retrofit retrofit2
以下blog 给出了各种 Android Async Http 客户端的速度比较。谁能解释一下是什么让改造如此之快?
【问题讨论】:
标签: android retrofit retrofit2
编辑:再次浏览博客文章后,单线程与多线程问题可能不是真的。问题是他们没有分享他们的分析/基准测试的血腥细节。那一组数字并不能提供太多洞察力。他们说,“我们确定从 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 的单线程性质。
【讨论】: