Android http請求使用接口回調

Android中不支持在主線程發起http請求數據,我們需要把http請求放到子線程中處理。爲了保證代碼的執行順序,可以使用接口回調的方式拿到請求到的數據並進行處理。

定義回調接口

public interface OnConnectResult {
    // 把請求的內容轉爲String類型
    void connectResultString(String result);
}

http請求類

http請求類的結構

public class HttpUtil {
    private static final String DEFAULT_PARAMS_ENCODING = "UTF-8";
    private static final int CONNECT_TIME_OUT = 10 * 1000;
    private static final int READ_TIME_OUT = 30 * 1000;
    // 此類中的方法只處理http的GET請求
    private static final String REQUEST_GET_METHOD = "GET";

    // 實現http請求返回String類型的方法。
    // 此方法中OnConnectResult接口類型的參數是爲了返回數據
    public static void performGetRequestToStringWithResult(final String urlStr, final OnConnectResult onConnectResult)
    {
        try
        {
            if (onConnectResult == null)
            {
                return;
            }

            // 創建一個子線程處理http請求
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 處理http請求
                    String resultStr = performGetRequestToString(urlStr);

                    // 通過接口回調的方式把http請求的內容返回到調用的地方
                    if (onConnectResult != null)
                    {
                        onConnectResult.connectResultString(resultStr);
                    }
                }
            }).start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // 處理http/https的GET請求,返回結果爲String類型
    public static String performGetRequestToString(String urlStr)
    {
        String result = null;
        HttpURLConnection httpURLConnection = null;
        InputStream inputStream = null;

        try
        {
            URL url = new URL(urlStr);

            // 判斷https還是http
            if (url.getProtocol().toLowerCase().equals("https"))
            {

                HostnameVerifier hnv = new HostnameVerifier()
                {
                    @Override
                    public boolean verify(String hostname, SSLSession session)
                    {
                        return true;
                    }
                };

                X509TrustManager trustManager = new X509TrustManager()
                {
                    @Override
                    public void checkClientTrusted(
                            java.security.cert.X509Certificate[] chain,
                            String authType) throws CertificateException {}

                    @Override
                    public void checkServerTrusted(
                            java.security.cert.X509Certificate[] chain,
                            String authType) throws CertificateException {}

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                };

                X509TrustManager[] xtmArray = new X509TrustManager[] { trustManager };
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, xtmArray,
                        new java.security.SecureRandom());

                if (sslContext != null)
                {
                    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
                }
                HttpsURLConnection.setDefaultHostnameVerifier(hnv);

                httpURLConnection = (HttpsURLConnection) url.openConnection();
            }
            else if (url.getProtocol().toLowerCase().equals("http"))
            {
                httpURLConnection = (HttpURLConnection) url.openConnection();
            }

            httpURLConnection.setConnectTimeout(CONNECT_TIME_OUT);
            httpURLConnection.setReadTimeout(READ_TIME_OUT);
            httpURLConnection.setRequestMethod(REQUEST_GET_METHOD);
            httpURLConnection.setDoInput(true);

            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
            {
                inputStream = httpURLConnection.getInputStream();

                // 把請求到的InputStream轉爲String
                result = getResultString(inputStream, DEFAULT_PARAMS_ENCODING);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (inputStream != null)
            {
                try
                {
                    inputStream.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

            if (httpURLConnection != null)
            {
                httpURLConnection.disconnect();
            }
        }

        return result;
    }

    // 把InputStream轉爲String
    private static String getResultString(InputStream inputStream, String encode)
    {
        String result = null;

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] data = new byte[1024];
        int len = 0;

        if (inputStream != null)
        {
            try
            {
                while ((len = inputStream.read(data)) != -1)
                {
                    outputStream.write(data, 0, len);
                }

                result = new String(outputStream.toByteArray(), encode);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (outputStream != null)
                {
                    try
                    {
                        outputStream.close();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }

        return result;
    }

    // 添加一個額外的方法,此方法把http請求強制轉爲https請求
    private static String httpForceToHttps(String urlStr)
    {
        try
        {
            if (urlStr == null || urlStr.isEmpty())
            {
                return urlStr;
            }

            URL url = new URL(urlStr);
            String protocol = url.getProtocol().toLowerCase();

            if (protocol.toLowerCase().equals("https"))
            {
                return urlStr;
            }

            if (protocol.toLowerCase().equals("http"))
            {
                String newUrlStr = urlStr.replace("http://", "https://");
                return newUrlStr;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return urlStr;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章