HttpURLConnection

什么是 HTTP请求

1.HTTP请求是客户端与服务端之间,发送请求和返回应答的标准。
2.客户端发出一个HTTP请求后,就与服务器建立起了TCP连接,服务端收到请求后饼进行处理后返回给客户端响应数据。

什么是HttpURLConnection

HttpURLconnection是基于http协议的,支持get,post,put,delete等各种请求方式,最常用的就是get和post。是java的标准指定网站发送
GET请求、POST请求类, Htipurlconnection继承自 Urlconnection,
可用于向指定网站发送GET请求、POST请求, Httpurl Connection在使
用上相对简单,并且易于扩展,推荐使用。

如何使用HttpURLConnection

1.创建URL对象
2.通过URL对象调用 open connection方法获得 Httpurlconnection对象
3. Httpurlconnectior对象设置其他连接属性
4. HTTPURL Connection对象调用 getlnputstream()方法向服务器发送htp请求
并获取到服务器返回的输入流
5.读取输入流,转换成Sng字符串

注意:
1.在 Android中访问网络必须添加网络权限

2.在 Android中访问网络必须放茌子线程中执行
权所有未经允许不得翻印

使用HttpURLConnection获取HTTP请求(以访问CSDN网站为例)

***第一步在布局文件里面添加按钮,赋上id。***
  <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/getweb_btn"/>

第二步就在activity里面绑定id和添加监听时间。因为发送get请求是耗时的操作,使用我们需要写一个子线程。

 getwebBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        getWebInfo();

                    }
                }).start();
            }
        });

然后我们就按照顺序来写。

 private void getWebInfo() {

        try {
            //1.找水源--创建URL
            URL url=new URL("https://www.csdn.net/");
         //2.开水闸--openConnection
            HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
         //3.建管道--InputStream
            InputStream inputStream=httpURLConnection.getInputStream();
         //4.建蓄水池蓄水--InputStreamReader
            InputStreamReader reader=new InputStreamReader(inputStream,"UTF-8");
          //5.水桶盛水-bufferedReader
            BufferedReader bufferedReader=new BufferedReader(reader);

            StringBuffer stringBuffer=new StringBuffer();
            String temp=null;

            while ((temp=bufferedReader.readLine())!=null){
                stringBuffer.append(temp);
            }

            bufferedReader.close();
            reader.close();
            inputStream.close();


            Log.e("Qing",stringBuffer.toString());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

最后记得在onclick里面要写上start。

加载图片

添加button和Imgview控件


    <Button
        android:id="@+id/jia_btn"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="加载图片" />


    <ImageView
        android:id="@+id/img"
        android:scaleType="fitCenter"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

第二步就是绑定id和添加监听事件。

  bindID();

        jiabtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImgLoadTask  task=new ImgLoadTask(loadImg);
                task.execute("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2716313616,2401035596&fm=27&gp=0.jpg");

            }
        });
    }

    private void bindID() {
        jiabtn=findViewById(R.id.jia_btn);
        loadImg=findViewById(R.id.img);

然后在包里面新建一个ImgLoadTask继承AsyncTask,在里面写上构造方法,用来传值。

  public ImgLoadTask (ImageView iv){
        this.imageView=iv;
    }

这边我因为要获取图片,所以我们要返回Bitmap类型。

  @Override
    protected Bitmap doInBackground(String... strings) {
        //加载网络图片,最后获取到一个Bitmap对象,返回Bitmap对象

        Bitmap bm=null;


        try {

            URL url=new URL(strings[0]);
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            InputStream inputStream=connection.getInputStream();//把输入流转换成Bitmap类型
            bm= BitmapFactory.decodeStream(inputStream);



        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return bm;
    }

    @Override
    protected void onPostExecute(Bitmap s) {
        super.onPostExecute(s);
        imageView.setImageBitmap(s);
    }

最后在activity里面execute方法里面添加图片的网址。

下载网络资源

这里面引用加载网络资源的activity和XML文件。然后新建一个DownLoadTask外部类继承AsyncTask

先下载图片的目录和文件存储位置,然后判断目录和文件是否存在,不存在就新建。

 private String dirPath;//下载图片的目录  例如/root/pic/
    private String filePath;//下载文件存储的具体位置

    @Override
    protected Integer doInBackground(String... strings) {

        String fileName = strings[1];//要存储图片的名字

        //判断图片是否存在,若不存在,则创建目录

        dirPath = Environment.getExternalStorageDirectory() + "/download_pics";


        File dir = new File(dirPath);//目录对象
        if (!dir.exists()) {
            dir.mkdir();
        }

        //判断文件是否存在,若不存在,则创建文件
        filePath = dirPath + fileName;
        File file = new File(filePath);//创建文件对象
        if (file.exists()) {
            return -1;
        } else {
            try {
                file.createNewFile();//不存在,就创建出这个文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

有了文件,就开始输出流与输入流,输入流这边需要判断一下。实行缓冲区,然后在onPostExecute里面写上switch语句。写上一个构造方法,里面参数是context,loadimg。

 public  DownLoadTask(Context context, ImageView loadImg){
        this.context=context;
        this.loadImg=loadImg;

    }
InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            if (connection.getResponseCode() == 200) {
                //判断返回码是否正常,若正常创建输入流,否则就直接返回
                inputStream = connection.getInputStream();
            } else {
                return -2;
            }
            outputStream = new FileOutputStream(file);
            int length = 0;
            byte[] buffer = new byte[4 * 1024];//缓冲区

            while ((length = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, length);
            }

            outputStream.close();
            inputStream.close();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 1;

    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        switch (integer){
            case 1:
                //正常完成
                Toast.makeText(context,"正常完成",Toast.LENGTH_SHORT).show();
                Bitmap bm= BitmapFactory.decodeFile(filePath);
                loadImg.setImageBitmap(bm);
                break;
            case  -1:
                //文件已存在
                Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
                break;
            case  -2:
                //网络异常
                Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
                break;
        }
    }

最后启动。


        jiabtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              DownLoadTask downLoadTask=new DownLoadTask(ShowActivity.this,loadImg);
              downLoadTask.execute(picUrl,"smm.jpg");
            }
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值