HttpUrlConnection
1.什么是Http请求?
- HTTP请求是客户端和服务器端之间,发送请求和返回应答的标准(TCP)。
- 客户端发出—个HTTP请求后,就与服务器建立起了TcP连接服务端接收到请求并进行处理后返回给客户端响应数据。
2.什么是HttpUrlConnection?
- URLConnection是个抽象类,它有两个直接子类分别是HttpURLConnection和JarURLConnection。另外一个重要的类是URL,通常URL可以通过传给构造器一个String类型的参数来生成一个指向特定地址的URL实例。
- 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。
3.ruhe使用HttpUrlConnection?
使用HttpUrlConnection发送GET请求的步骤:
1.创建URL对象
2.通过URL对象调用 open Connection方法获得 Httpurlconnection对象
3 Httpurlconnectiont对象设置其他连接属性
4. Httpurlconnection对象调用 getinputstream(方法向服务器发送htt请求
并获取到服务器返回的输入流
5.读取输入流,转换成Srng字符串
4.使用HttpUrlConnection获取Http请求(以访问csdn网站为例,附代码)
java代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 MainActivity extends AppCompatActivity {
private Button getwebBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
getwebBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
getWebInfo();
}
}).start();
}
});
}
public void getWebInfo() {
try{
//1.找水源--创建URL
URL url=new URL("https://www.youkuaiyun.com/");
//2.开水闸--openConnection
HttpURLConnection httpURLConnectin=(HttpURLConnection) url.openConnection();
//3.建管道--InputStream
InputStream inputStream=httpURLConnectin.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("MAIN",stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void bindID() {
getwebBtn=findViewById(R.id.getweb_btn);
}
}
5.使用HttpURLConnection加载网络图片(附代码)
java代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.BufferedReader;
public class Main2Activity extends AppCompatActivity {
private Button loadBtn;
private ImageView loadImg;
private String picUcl="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520920876648&di=0865e9d5a544e1ae1669530dba3e7455&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F9f510fb30f2442a7bd5eb281db43ad4bd1130245.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bindID();
loadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DownloadTask task=new DownloadTask(Main2Activity.this);
task.execute(picUcl,"frarri.jpg" );
// ImgLoadTask task = new ImgLoadTask(loadImg);
// task.execute("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520920876648&di=0865e9d5a544e1ae1669530dba3e7455&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F9f510fb30f2442a7bd5eb281db43ad4bd1130245.jpg");
}
});
}
private void bindID() {
loadBtn=findViewById(R.id.loadpic_btn);
loadImg=findViewById(R.id.loadpic_img);
}
}
6.使用HttpURLConnection下载网络资源(附代码)
java代码:
public class DownLoadTask extends AppCompatActivity {
private Button downBtn;
private ImageView downImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_task);
bindID();
downBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DownLoadPicTask task = new DownLoadPicTask(DownLoadTask.this,downImage);
task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
}
});
}
private void bindID() {
downBtn = findViewById(R.id.down_btn);
downImage = findViewById(R.id.pic_image);
}
}
这里需要注意的有一点,就是构造方法的定义与传值,根据外部类的需要进行传值
DownLoadPicTask task = new DownLoadPicTask(DownLoadTask.this,downImage);
task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
这里还可以写成
new DownLoadTask(DownLoadTask.this,downImage).execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
然后创建外部类DownLoadPicTask.java继承AsyncTask()方法,实现doInBackground()与onPostExecute()方法;
先附上完整外部类代码
public class DownLoadPicTask extends AsyncTask<String,Integer,Integer>{
private Context context;
private ImageView downImage;
private String dirPath;
private String filePath;
public DownLoadPicTask(Context context,ImageView image) {
this.context = context;
this.downImage = image;
}
@Override
protected Integer doInBackground(String... strings) {
dirPath = Environment.getExternalStorageDirectory()+"/download_pics/";
File dir = new File(dirPath);//目录
if (!dir.exists()){
dir.mkdir();
}
filePath = dirPath+strings[1];
File file = new File(filePath);
if (file.exists()){
return -1;
}else {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
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);
}
inputStream.close();
outputStream.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);
downImage.setImageBitmap(bm);
break;
case -1:
Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
break;
}
}
}
首先需要判定文件夹是否存在,所以定义两个目录和文件对象
private String dirPath;
private String filePath;
然后判断目录是否存在,若不存在,则创建目录
dirPath = Environment.getExternalStorageDirectory()+"/download_pics/";
创建目录
File dir = new File(dirPath);//目录
if (!dir.exists()){
dir.mkdir();
}
再判断文件是否存在,若不存在,则创建文件
filePath = dirPath+strings[1];//文件位置就是目录位置+传值过来的文件名
File file = new File(filePath);
if (file.exists()){
return -1;
}else {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return的-1传值给onPostExecute()方法进行switch判定
if (file.exists()){
return -1;
}
下面对输入流与输出流进行设置
InputStream inputStream= null;
OutputStream outputStream = null;
照例进行URL的初步设置
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);
如果返回码不是200,连接不成功,return的-2传值给onPostExecute()方法进行switch判定
else {
return -2;
}
如果返回码等于200,连接成功后,调用getInputStream()方法赋值给inputStream对象
if (connection.getResponseCode()==200){
inputStream = connection.getInputStream();
}
接着对输出流进行设置
outputStream = new FileOutputStream(file);
对输出流进行读取
int length = 0;
byte[] buffer = new byte[4*1024];
while ((length=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,length);
}
结束之后要对于输入流和输出流进行关闭
inputStream.close();
outputStream.close();
最后在onPostExecute()方法中,对传过来的值进行情况判定与输出
@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);
downImage.setImageBitmap(bm);
break;
case -1:
Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
break;
}
}
这里用到了context与downImage对象,需要从构造方法中传值
Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
downImage.setImageBitmap(bm);
这是写在外部类里面的构造方法
public DownLoadPicTask(Context context,ImageView image) {
this.context = context;
this.downImage = image;
}
这一句调用了BitmapFactory.decodeFile()方法来解码图片
Bitmap bm = BitmapFactory.decodeFile(filePath);

本文是HttpUrlConnection的实训笔记,介绍了Http请求的基本概念,详细讲解了HttpUrlConnection的使用,包括发送GET请求、加载网络图片和下载网络资源的实例代码。
3231

被折叠的 条评论
为什么被折叠?



