Android Studio中HTTP的请求

1.HttpUrlConnection

1,什么是Http请求?
  • HTTP请求是客户端和服务器端之间,发送请求和返回应答的
    标准( TCP)。
  • 客户端发出一个HTTP请求后,就与服务器建立起了TCP连接,
    服务端接收到请求并进行处理后返回给客户端响应数据。
2,什么是HttpUrlConnection?
  • HttpURLConnection是java的标准指定网站发送GET请求、POST请求类,
  • HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求,
  • HttpURLConnction在使用上相对简单,并且易于扩展,推荐使用.(还有HttpClient不过很少有人用了)
3,如何使用HttpUrlConnection?
1.创建URL对象
2.通过URL对象调用openConnection()方法获得HttpURLConnection对象
3.HttpURLConnection对象设置其他连接属性
4.HttpURLConnection对象调用getInputStream()方法向服务器发送http请求
并获取到服务器返回的输入流
5.读取输入流,转换成String字符串
4,使用HttpUrlConnection获取Http请求(以访问百度网站为例)
package com.example.abc.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Main2Activity extends AppCompatActivity {

    private Button btn;//点击按钮访问

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        btn = findViewById(R.id.main2_btn);//绑定ID
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {//监听按钮
                new Thread(new Runnable() {//创建子线程
                    @Override
                    public void run() {
                        getwebinfo();//把路径选到MainActivity中
                    }
                }).start();//启动子线程
            }
        });
    }

    private void getwebinfo() {
        try {
            //1,找水源--创建URL
            URL url = new URL("https://www.baidu.com/");//放网站
            //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 buffer = new StringBuffer();
            String temp = null;

            while ((temp = bufferedReader.readLine()) != null) {
                //取水--如果不为空就一直取
                buffer.append(temp);
            }
            bufferedReader.close();//记得关闭
            reader.close();
            inputStream.close();
            Log.e("MAIN",buffer.toString());//打印结果

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

在打印的结果中看到类似这种出现网页代码的基本上就已经访问到了。

这里写图片描述

2. 使用HttpUrlConnection加载图片

Activity展示:
package com.example.abc.app3131;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class ImgActivity extends AppCompatActivity {

    private Button btn;
    private ImageView im;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_img);
        im=findViewById(R.id.img_iv);
        btn=findViewById(R.id.img_btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImgLoadTask imgLoadTask=new ImgLoadTask(im,btn);
                imgLoadTask.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg");
                //启动
            }
        });
    }
}
ImgLoadTask 展示:
package com.example.abc.app3131;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.Button;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by Administrator on 2018/3/13.
 */

public class ImgLoadTask extends AsyncTask<String,Integer,Bitmap>{

    private ImageView imageView;
    private Button btn;

    public ImgLoadTask(ImageView im, Button btn) {
        this.imageView=im;
        this.btn=btn;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        btn.setEnabled(false);
        btn.setText("加载完成");
    }

    @Override
    protected Bitmap doInBackground(String... strings) {
        Bitmap bm=null;
        try {
            URL url=new URL(strings[0]);
            //创建URL对象
            HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
            //使用openConnection获取HttpURLConnection对象
            InputStream inputStream=httpURLConnection.getInputStream();
            //输入流inputStream
            bm= BitmapFactory.decodeStream(inputStream);
            //图片
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bm;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        imageView.setImageBitmap(bitmap);//把结果图片放到控件上
    }
}
加载效果展示:

Android Studio中HTTP的请求_第1张图片

3. 使用HttpUrlConnection下载图片

要求:按键点击下载并显示图片
思路:

下载需要权限先将权限设置好。
按键点击下载并显示图片。
图片下载的图片网上路径。
下载下来需要放在本地文件中
创建图片所需要文件目录。
创建文件所需要的文件路径。
判断文件目录是否存在,没有创建。
判断文件是否存在,没有创建,有则返回结束。
文件不存在用URl查找。
判断返回值是否是200,错误返回返回值。
创建缓存区将文件下载到文件路径中。
显示图片

下载图片需要网络权限,读取权限和写入权限。
 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>`
将包导入到Gradle Scripts中的build.gradle中的对应app放到dependencies方法 中
    compile 'com.master.android:permissionhelper:1.4'
MainActivity展示:

有PermissionHelper 的地方就是权限所需的条件

package com.example.abc.app3141;

import android.Manifest;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.master.permissionhelper.PermissionHelper;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private ImageView img;
    private PermissionHelper permissionHelper;
    private String filename = "http://img03.sogoucdn.com/app/a/100520093/e18d20c94006dfe0-9eef65073f0f6be0-893885322f6eaef864e687f1df8bc129.jpg";

    //图片路径
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindID();//绑定ID
        permissionHelper = new PermissionHelper(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
        permissionHelper.request(new PermissionHelper.PermissionCallback() {
            @Override
            public void onPermissionGranted() {
                btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {//赋予权限可以上网,和使用本地
                        DownloadTask task=new DownloadTask(MainActivity.this, btn, img);//新建
                        //(上下文,按钮,图片)
                        task.execute(filename, "5n1.jpg");//启动
                        //(网上路径,下载到本地时的图片名称)
                    }
                });
            }

            @Override
            public void onIndividualPermissionGranted(String[] grantedPermission) {

            }

            @Override
            public void onPermissionDenied() {

            }

            @Override
            public void onPermissionDeniedBySystem() {

            }
        });
    }

    private void bindID() {
        btn = findViewById(R.id.main_btn);
        img = findViewById(R.id.main_img);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (permissionHelper != null) {
            permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}
DownloadTask展示:
package com.example.abc.app3141;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by Administrator on 2018/3/14.
 */

public class DownloadTask extends AsyncTask<String, Integer, Integer> {
    private String dirpath;//下载文件的目录 例如:c/wenjian 具体到文件所在地
    private String filepath;//文件存储的具体路径 例如:c/wenjian/123.jpg 具体到文件到在哪
    private Context context;//上下文环境
    private Button btn;
    private ImageView img;

    public DownloadTask(Context context, Button btn, ImageView img) {//构造方法
        this.context = context;
        this.btn = btn;
        this.img = img;
    }

    @Override
    protected Integer doInBackground(String... strings) {
        String filename = strings[1];//将MainActivity中的第二个文件名赋给filename
        dirpath = Environment.getExternalStorageDirectory() + "/download_picture/";
        //把外部环境+要开创的新的路径赋给dirpath
        File dir = new File(dirpath);//创建一个新 File 实例。
        if (!dir.exists()) {//判断dir是否存在
            //不存在就创建空目录
            dir.mkdir();
        }
        filepath = dirpath + filename;//filepath是详细地址=文件路径+文件名(filename=string【1】)
        File file = new File(filepath);//创建一个新 File 实例。
        if (!file.exists()) {//判断文件是否存在
            try {
                file.createNewFile();//不存在创建新文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            return -1;//不存在则返回返回值(-1=文件已存在)
        }

        InputStream inputStream = null;//定义一个InputStream变量 ,输入流
        OutputStream outputStream = null;//定义一个InputStream变量 ,输出流
        /*下载图片时--输入流是网络,输出流是本地*/
        /*上传图片时--输出流是网络,输入流是本地*/
        try {
            URL url = new URL(strings[0]);//创建URL对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //用openConnection获取HttpURLConnection对象
            if (connection.getResponseCode() == 200) {
                //判断返回值是否为200(200为正常值,404为客户端错误,505为服务器错误)
                inputStream = connection.getInputStream();
            } else {
                return -2;//错误则返回返回值(-2=网络错误)
            }
            outputStream = new FileOutputStream(file);//输出流到本地
            int length = 0;//下载总量
            byte[] buffer = new byte[4 * 1024];//缓存区(4*1204=4k)
            while ((length = inputStream.read(buffer)) != -1) {
                //下载一直持续到最后一波正好结束再返回时发现没东西时结束(或者有空余)。
                outputStream.write(buffer, 0, length);
                //输入流写缓存区内容,从0到总长度
            }
            inputStream.close();//关闭输入流
            outputStream.close();//关闭输出流
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 1;//返回值设为1(1=下载完成)
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        switch (integer) {//使用switch语句对几个不同的返回值做回应
            case 1:
                //(1=下载完成)
                Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();//把状态都Toast出来
                Bitmap bitmap = BitmapFactory.decodeFile(filepath);//将filepath(图片详细路径)从本地图库调用出来
                img.setImageBitmap(bitmap);//把值赋给控件
                //下载完成显示图片
                break;
            case -1:
                //(-1=文件已存在)
                Toast.makeText(context, "文件已存在", Toast.LENGTH_SHORT).show();
                Bitmap bm = BitmapFactory.decodeFile(filepath);
                img.setImageBitmap(bm);
                break;
            case -2:
                //(-2=网络错误)
                Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
下载效果展示:

Android Studio中HTTP的请求_第2张图片

你可能感兴趣的:(Android,Studio)