一、概述

在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详解的运行结果。

更多相关文章

  1. Android(安卓)关于获取摄像头帧数据
  2. android 实现高德2D地图,定位和定位蓝点
  3. Android中Intent与Bundle 在传值时有什么不同
  4. Android第三方登录-----微信登录接入方法
  5. android系统信息(内存、cpu、sd卡、电量、版本)获取
  6. Android从远程服务器下载文件到本地sd卡中
  7. android 开发谷歌地图的步骤
  8. Android(安卓)HLS协议相关记录及部分解析
  9. Android系统信息(内存、cpu、sd卡、电量、版本)获取

随机推荐

  1. Android(安卓)在代码中控制View的填充方
  2. Android(安卓)Studio 中Gradle配置debug
  3. Android初步笔记
  4. Android中文API(141) —— GridLayout
  5. Android Ant的部署
  6. android桌面小部件appwidget使用ListView
  7. Android(安卓)中的Context 上下文
  8. clickhouse
  9. 2012.06.28(2)——— android onMeasure
  10. Android(安卓)RxJava:功能性操作符 全面讲