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;    }}

更多相关文章

  1. Android开发包下载(包括开发所需所有安装包的下载方法与地址)
  2. android:MATCH_PARENT是什么类型的布局
  3. android下的文件资源类型
  4. Android获取系统时间方法的总结
  5. Intent传递对象的两种方法(Serializable,Parcelable)
  6. [置顶] Android之ContextMenu的使用方法以及与OptionMenu的区别
  7. INSTALL_FAILED_CONFLICTING_PROVIDER 错误解决方法

随机推荐

  1. 坑爹的Android新ADT
  2. androidの实现分享功能
  3. cocos2d-x&android返回键&菜单键
  4. Android(安卓)ApiDemos示例解析(111):Vie
  5. Android(安卓)apiDemo 学习——对话框Ale
  6. Android3.0自带天气例子
  7. android - DefaultHttpClient设置超时.
  8. Android开发之AIDL的使用
  9. android输入法特殊字符修改
  10. android 选项卡TabHost