HttpURLConnection使用详情

HttpURLConnection使用详情

使用HttpURLConnection获取网页源码的一个小案例(GET请求方式)

在使用HttpURLConnection一定要注意权限的问题,否者可能会出现错误,导致无法访问,PS:无法请求到重定向的网页的内容,在manifest文件中加上如下权限即可访问。在android4.0以上Google规定,访问网络必须开线程访问,否则会抛出异常

    <uses-permission android:name="android.permission.INTERNET"/>

凡是网络的访问都要加上这句

	new Thread() {
                @Override
                public void run() {
                    //获取内容
                    String path = editText.getText().toString().trim();
                    //创建URL对象。指定要访问的网址(路径)
                    try {
                        URL url = new URL(path);
                        //拿到HttpURLConnection对象 用于发送或者接受数据
                        HttpURLConnection httpURLConnection = 		(HttpURLConnection) url.openConnection();
                        //设置发送get请求
                        httpURLConnection.setRequestMethod("GET");//get要求大写,默认就是get请求
                        //设置请求的超时时间
                        httpURLConnection.setConnectTimeout(5000);
                        //获取服务器返回的状态码
                        int responseCode = httpURLConnection.getResponseCode();
                        Log.i("TAG", "run: 响应了" + responseCode);
                        //如果code等于200说明请求成功
                        if (responseCode == 200) {
                            Log.i("TAG", "run: 响应成功");
                            //获取服务器返回的数据,是以流的形式返回的(由于把流转成字符串是一个非常常见的操作,所以可以抽出一个方法)
                            InputStream inputStream = httpURLConnection.getInputStream();
                            //把流里面的数据展示到textView上面去
                            content = StreamTools.readStream(inputStream);//将流转化为字符串
                            handler.sendEmptyMessage(0);//由于是在子线程中,所以必须使用Handler更新主线程视图,否则会抛出异常
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();

使用HttpURLConnection一定要开线程,因为HttpURLConnection是一个同步的任务,不开线程可能会造成界面卡顿,因为HttpURLConnection返回的是一个流对象(注意:只有在请求状态为200时才能从请求中获取到源码),所以我把流处理的方法做成了一个工具类来使用。由于是在子线程中,所以必须使用Handler更新主线程视图,否则会抛出异常

public class StreamTools {
    //把一个InputStream 转化成一个String
    public static String readStream(InputStream inputStream) throws IOException {
        //定义一个内存输出流 这个流会将数据直接写入内存中
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];//1kb
        while ((len = inputStream.read(bytes)) != -1) {
            //将流中的数据直接写入内存
            byteArrayOutputStream.write(bytes, 0, len);
        }
        inputStream.close();
        //byteArrayOutputStream.toByteArray() 是将流中的数据取出并转成字符串
        return new String(byteArrayOutputStream.toByteArray());//用new String转成字符串
    }
}

这时使用这段代码就会返回指定的网址的源码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值