Android 开发之访问网络

来源:互联网 发布:淘宝代购only是正品吗 编辑:程序博客网 时间:2024/05/22 04:33

现在访问网络有好多非常优秀的框架,比如 OKHTTP,Volley 等等,但是最基本的 HttpURLConnection 用法我们不能忘记,由于 HttpClient 在 Android6.0 系统上已被废弃,这里就不写了,访问网络无非是使用 http 协议(本文介绍了使用 https 协议的例子,很遗憾,本人还没完全弄清楚,以后再深究)

用 HttpURLConnection 访问网络

/**address:访问的网络地址listener:监听*/public static void sendHttpRequest(final String address, final HttpCallbackListener listener){        new Thread(new Runnable() {            @Override            public void run() {                HttpURLConnection connection = null;                InputStream inputStream = null;                try {                    URL url = new URL(address);                    connection = (HttpURLConnection) url.openConnection();                    connection.setRequestMethod("GET");                    connection.setConnectTimeout(8000);                    connection.setReadTimeout(8000);                    connection.setDoInput(true);                    connection.setDoOutput(true);                    connection.connect();                    if (connection.getResponseCode() == 200) {                        inputStream = connection.getInputStream();                        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));                        StringBuilder sb = new StringBuilder();                        String line;                        while ((line = br.readLine()) != null) {                            sb.append(line);                        }                        if (listener != null) {                            listener.onFinish(sb.toString());//从服务器获得的数据返回给调用方(依然是在子线程)                        }                    }                } catch (MalformedURLException e) {                    e.printStackTrace();                } catch (IOException e) {                    if (listener != null) {                        listener.onFailed(e);//失败                    }                } finally {                    if (connection != null) {                        connection.disconnect();                    }                    if (inputStream != null) {                        try {                            inputStream.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }        }).start();    }

HttpCallbackListener接口

public interface HttpCallbackListener {        void onFinish(String response);        void onFailed(Exception e);    }

把从服务器中读取的内容转换为字符串

public static String readFromStream(InputStream is) throws IOException{        ByteArrayOutputStream baos = new ByteArrayOutputStream();        byte[] buff = new byte[1024];        int len = 0;        while((len =is.read(buff))!= -1){            baos.write(buff, 0, len);        }        String result = baos.toString();        is.close();        baos.flush();        baos.close();        return result;    }

使用https协议

public static void sendHttpRequest(final String address, final HttpCallbackListener listener){        new Thread(new Runnable() {            @Override            public void run() {                HttpsURLConnection connection = null;                InputStream inputStream = null;                try {                    SSLContext sc = SSLContext.getInstance("TLS");                    sc.init(null, new TrustManager[]{new MyTrustManager()}, new SecureRandom());                    URL url = new URL(address);                    connection = (HttpsURLConnection) url.openConnection();                    connection.setSSLSocketFactory(sc.getSocketFactory());                    connection.setHostnameVerifier(new MyHostnameVerifier());                    connection.connect();                    if (connection.getResponseCode() == 200) {                        inputStream = connection.getInputStream();                        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));                        StringBuilder sb = new StringBuilder();                        String line;                        while ((line = br.readLine()) != null) {                            sb.append(line);                        }                        if (listener != null) {                            listener.onFinish(sb.toString());//从服务器获得的数据返回给调用方(依然是在子线程)                        }                    }                } catch (MalformedURLException e) {                    e.printStackTrace();                } catch (IOException e) {                    if (listener != null) {                        listener.onFailed(e);                    }                } catch (NoSuchAlgorithmException e) {                    e.printStackTrace();                } catch (KeyManagementException e) {                    e.printStackTrace();                } finally {                    if (connection != null) {                        connection.disconnect();                    }                    if (inputStream != null) {                        try {                            inputStream.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }        }).start();    }

用到的MyHostnameVerifier和MyTrustManager类

 private static class MyHostnameVerifier implements HostnameVerifier {        @Override        public boolean verify(String hostname, SSLSession session) {            // TODO Auto-generated method stub            return true;        }    }    private static class MyTrustManager implements X509TrustManager {        @Override        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {        }        @Override        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {        }        @Override        public java.security.cert.X509Certificate[] getAcceptedIssuers() {            return null;        }    }

使用OkHttp框架访问网络,使用回调函数返回数据

public static void sendOkHttpRequest(String url, okhttp3.Callback callback) {        OkHttpClient okHttpClient = new OkHttpClient();        Request request = new Request.Builder()                .url(url)                .build();        okHttpClient.newCall(request).enqueue(callback);    }

PS:其实上面思路也是常用的,在郭神《第一行代码第二版》有详细讲解。。。

0 0
原创粉丝点击