1. 程式人生 > >Android 開發之訪問網路

Android 開發之訪問網路

現在訪問網路有好多非常優秀的框架,比如 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:其實上面思路也是常用的,在郭神《第一行程式碼第二版》有詳細講解。。。