什么是 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");
}
});
}