zoukankan      html  css  js  c++  java
  • android4.4之后的HttpUrlConnection的实现是基于okhttp

    首先看HttpUrlConnection使用

    URL url = new URL("http://www.baidu.com");
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("get");
    urlConnection.connect();
    int responseCode = urlConnection.getResponseCode();

    下面看URL类的源码实现

    transient URLStreamHandler handler;
    
    public URL(String spec) throws MalformedURLException {
            this(null, spec);
        }
    
    public URL(URL context, String spec, URLStreamHandler handler)
            throws MalformedURLException
        {
                //...
                // Get the protocol handler if not specified or the protocol
                // of the context could not be used
                if (handler == null &&
                    (handler = getURLStreamHandler(protocol)) == null) {
                    throw new MalformedURLException("unknown protocol: "+protocol);
                }
    
                this.handler = handler;
    
                //...
        }
    
    public URLConnection openConnection() throws java.io.IOException {
            return handler.openConnection(this);
        }
    
    static URLStreamHandler getURLStreamHandler(String protocol) {
    
            URLStreamHandler handler = (URLStreamHandler)handlers.get(protocol);
            //...
    
                // Fallback to built-in stream handler.
                // Makes okhttp the default http/https handler
                if (handler == null) {
                    try {
                        if (protocol.equals("file")) {
                            handler = (URLStreamHandler)Class.
                                forName("sun.net.www.protocol.file.Handler").newInstance();
                        } else if (protocol.equals("ftp")) {
                            handler = (URLStreamHandler)Class.
                                forName("sun.net.www.protocol.ftp.Handler").newInstance();
                        } else if (protocol.equals("jar")) {
                            handler = (URLStreamHandler)Class.
                                forName("sun.net.www.protocol.jar.Handler").newInstance();
                        } else if (protocol.equals("http")) {
                            handler = (URLStreamHandler)Class.
                                forName("com.android.okhttp.HttpHandler").newInstance();
                        } else if (protocol.equals("https")) {
                            handler = (URLStreamHandler)Class.
                                forName("com.android.okhttp.HttpsHandler").newInstance();
                        }
                    } catch (Exception e) {
                        throw new AssertionError(e);
                    }
                }
    
                //...
            }
    
            return handler;
    
        }

    URL.openConnection()中的handler实例通过getURLStreamHandler方法中反射(com.android.okhttp.HttpHandler)的形式获得。

    从Android 4.4开始,HttpURLConnection的实现确实是通过调用okhttp完成的,而具体的方法则是通过HttpHandler这个桥梁,以及在OkHttpClient, HttpEngine中增加相应的方法来实现,当然,其实还涉及一些类的增加或删除。

    附:

    但是通过类搜索方法并没有找到okhttp.HttpHandler。下面给出解析:

    OkHttp in Android is here: https://android.googlesource.com/platform/external/okhttp/+/master. 
    The reason the package name is com.android.okhttp is because there are jarjar rules which repackage it under that name.
    因为jarjar-rules的存在,其实路径为/external/okhttp/jarjar-rules.txt,内容如下: rule com.squareup.** com.android.@1 rule okio.** com.android.okio.@1
  • 相关阅读:
    HAVING用法详解
    spring的定时任务
    js 将json字符串转换为json对象的方法解析
    Struts2 SSH整合框架返回json时,要注意懒加载问题
    Struts2 本是非单例的,与Spring集成就默认为单例
    Android 判断当前联网的类型 wifi、移动数据流量
    Android 动画的重复播放
    Android 监测手机联网状态 wifi、移动数据流量、无联网状态
    Android 设置界面的圆角选项
    Android 用Activity的onTouchEvent来监听滑动手势
  • 原文地址:https://www.cnblogs.com/genggeng/p/10103954.html
Copyright © 2011-2022 走看看