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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值