Android之使用HttpURLConnection进行网络访问
16lz
2022-04-12
一、概述
在Android 上发送HTTP 请求的方式一般有两种:HttpURLConnection 和HttpClient。因为在Android 5.0之后,HttpClient被HttpURLConnecetion替代,后来在Android 6.0完全被舍弃,所以本文重点讲解HttpURLConnecetion。
二、HttpURLConnecetion的使用步骤
(1)首先需要获取到HttpURLConnection 的实例,一般只需new 出一个URL 对象,并传入目标的网络地址,然后调用一下openConnection()方法即可,如下所示:
URL url = new URL("http://www.baidu.com");HttpURLConnection connection = (HttpURLConnection) url.openConnection();
(2)得到了HttpURLConnection 的实例之后,我们可以设置一下HTTP 请求所使用的方法。常用的方法主要有两个,GET 和POST。GET 表示希望从服务器那里获取数据,而POST 则表示希望提交数据给服务器。写法如下:
httpURLConnection.setRequestMethod("GET");
(3)接下来就可以进行一些自由的定制了,比如设置连接超时、读取超时的毫秒数,以及服务器希望得到的一些消息头等。这部分内容根据自己的实际情况进行编写,示例写法如下:
connection.setConnectTimeout(8000);connection.setReadTimeout(8000);
(4)之后再调用getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是对输入流进行读取,如下所示:
InputStream in = connection.getInputStream();
(5)最后可以调用disconnect()方法将这个HTTP 连接关闭掉,如下所示:
connection.disconnect();
三、HttpURLConnecetion的使用范例
为简单起见,还是在Android之AsyncTask详解基础上修改,实现下载图片的功能,原本使用HttpClient实现,我们换做HttpURLConnecetion来实现。
package com.wz;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity { private ProgressDialog progressDialog;//下载进度条 private Button button; private ImageView imageView; //图片下载地址 private final String IMAGE_URL = "http://a.hiphotos.baidu.com/image/pic/item/fcfaaf51f3deb48fc4cedcdff21f3a292df5780f.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new MyAsyncTask().execute(IMAGE_URL); } }); imageView = (ImageView) findViewById(R.id.imageView); progressDialog = new ProgressDialog(this); progressDialog.setTitle("提示"); progressDialog.setMessage("正在下载,请稍后..."); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); } class MyAsyncTask extends AsyncTask { @Override protected void onPreExecute() { // 显示进度对话框 progressDialog.show(); } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); InputStream inputStream = null; HttpURLConnection connection = null; try { //第一步,获取到HttpURLConnection 的实例 URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); //第二步,设置一下HTTP 请求所使用的方法GET ,从服务器那里获取数据 connection.setRequestMethod("GET"); //第三步,设置连接超时、读取超时 connection.setConnectTimeout(8000); connection.setConnectTimeout(8000); int code = connection.getResponseCode(); if (code == 200) { //第四步,获取到服务器返回的输入流,并进行读取 inputStream = connection.getInputStream(); long file_len = connection.getContentLength(); int len = 0; byte[] data = new byte[1024]; int total_len = 0; while ((len = inputStream.read(data)) != -1) { total_len += len; int value = (int) ((total_len / (float) file_len) * 100); //反馈当前任务的执行进度 publishProgress(value); outputStream.write(data, 0, len); } byte[] result = outputStream.toByteArray(); bitmap = BitmapFactory.decodeByteArray(result, 0, result.length); } } catch (Exception e) { e.printStackTrace(); } finally { //第五步,将这个HTTP 连接关闭掉 if(connection != null){ connection.disconnect(); } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return bitmap; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //设置进度条刻度 progressDialog.setProgress(values[0]); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); //关闭进度条 progressDialog.dismiss(); //显示图片 imageView.setImageBitmap(bitmap); } }}
运行结果显示,详见Android之AsyncTask详解的运行结果。
更多相关文章
- Android(安卓)关于获取摄像头帧数据
- android 实现高德2D地图,定位和定位蓝点
- Android中Intent与Bundle 在传值时有什么不同
- Android第三方登录-----微信登录接入方法
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- Android从远程服务器下载文件到本地sd卡中
- android 开发谷歌地图的步骤
- Android(安卓)HLS协议相关记录及部分解析
- Android系统信息(内存、cpu、sd卡、电量、版本)获取