我应该在Volley库中使用OkHttp吗?

14

我在我的Android应用程序中使用Volley库。它工作得很好,但是我发现OkHttp还提供了一些更多的改进。我已经使用以下方式将OkHttp与Volley集成:


我在我的Android应用程序中使用Volley库。它工作正常,但我注意到OkHttp还提供了更多的改进。我已经使用以下方法将OkHttp与Volley集成:

Volley.newRequestQueue(mCtx.getApplicationContext(), new OkHttpStack());

我的OkHttpStack类是:

public class OkHttpStack extends HurlStack {
    private final OkUrlFactory mFactory;

    public OkHttpStack() {
        this(new OkHttpClient());
    }

    public OkHttpStack(OkHttpClient client) {
        if (client == null) {
            throw new NullPointerException("Client must not be null.");
        }
        mFactory = new OkUrlFactory(client);
    }

    @Override protected HttpURLConnection createConnection(URL url) throws IOException {
        return mFactory.open(url);
    }
}

1) 值得吗?我没有注意到任何明显的改进,但这可能是因为我仍然没有在我的服务器上实现SPDY支持。

2) OkHttp 的一个增强功能是响应缓存。然而,Volley 也有这个功能。我会遇到类似于这个问题吗:https://github.com/square/okhttp/issues/680

3) 另外,我在 Volley 中使用了两个 RequestQueues - 一个用于图像,另一个用于 JSON。我应该在这两个队列中都使用 OkHttp 吗?

2个回答

10

我建议你转向使用不使用okhttp-urlconnection的堆栈,就像这个 -> https://goo.gl/ZZRSQ5

1) 是的,OkHttp有很多优点,比如速度快、支持HTTP/2、SPDY,可以节省带宽......

2) 我没有遇到任何问题。

3) 你只需要一个com.android.volley.RequestQueue就可以应对两者。看一下这个 -> https://goo.gl/GMn3Ls

我在这里写了关于OkHttp + Volley + Gson的文章 -> https://goo.gl/nl2DfN。我认为这可能对你有趣。


谢谢!好文章。我已经在我的应用程序中使用OkHttp + Volley有一段时间了,表现不错。现在我正在为它添加Gson支持。顺便问一下,okhttp-urlconnection有什么问题?这个东西的好处是什么:https://goo.gl/ZZRSQ5 - User31689
这个堆栈是否与 Retrofit 很好地结合? - IgorGanapolsky
Retrofit 是一个不同的堆栈。我不确定我理解了你的问题 @IgorGanaposlky。 - Sotti

3

我不确定。

但我处于类似的位置,我倾向于“不,暂时不要”。不过我有一些想法,我会详细解释:

在我的使用中,我没有发现使用OkHttp替代Volley有任何实际好处。(我连接的HTTPS服务器不支持SPDY,而且我知道我已经得到了连接池和gzip编码,我也知道Volley内置了一个可用的缓存。)并且它会使应用程序增加几百K,这只会损害性能。

但是OkHttp确实具有可以改变Volley的功能:真正的连接中止。这是我最感兴趣的地方,因为我的应用程序发送了很多请求,并且取消了很多请求。目前,Volley实际上不会停止已经打开连接(或者接近打开连接)的请求,它仅标记为已取消并丢弃服务器响应。

对语义来说没问题,但对我的情况有严重的性能影响。具体而言,如果我向将死的服务器发送了大量请求,而且这些请求即将超时,那么Volley每个请求需要约30秒才能超时,在此期间,由于连接池忙于等待超时的连接,其他排队的请求无法利用网络连接。

所以我正在考虑的是,编写一个“OkHttpStack”,将#cancel()事件传递给OkHttp并实际中止连接,这对我来说将是一个重大的胜利。

顺带一提,在我查看过的Android 4.4手机上,它们都使用OkHttp实现的HTTPUrlConnection,而且未来你也可以免费使用。


1
实际上有一个好处。如果您默认使用Volley,则无法强制其在Android 4.3及以下版本上默认使用TLS。如果您使用OkHttp作为自定义堆栈,您可以强制执行它。 - Pier Betos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接