Android---HttpURLConnection基础

Android网络请求----HttpUrlConnection
使用方法

1.创建一个URL对象
URL url = new URL(“=======传入访问地址=====”);
HttpUrlConnection mHttpUrlConnection = (HttpUrlConnection)url.openConnection();
//HttpUrlConnection 继承自UrlConnection.openConnection()返回一个URLConnection。
//Java转型,父类引用指向子类
//向上转型
//Father f1 = new Son();//子类向上转型
//Son s1 = (Son)f1;//向下强制转型
/************************官网介绍**************************/
使用这个类遵循以下规则:
1、通过URL.openConnection获得,并转换为HttpUrlConnection
2、发起请求之前,最重要的属性是他的URI,请求头部可能包含元数据,例如认证信息,首选内容类型,会话的cookie。
3、通常包含一个上传内容,必须调用setDoOutput(true),将数据转换为流
4、获取返回内容,通常返回的头部包括一些元素,例如返回body的类型和长度,修改后的数据,
和会话的cookie,要获取返回的body的内容可以通过getInputStream()来获取。如果body中没有内容,则会拿到一个空的流。
5、断开连接,一个返回body被读完了,HttpUrlConnection应该关闭,通过调用disconnect()
关闭。断开连接,释放资源。

使用HTTPS安全的交流
当URL调用openConnection打开一个以”https”的网址,会返回一个HttpsURLConnection

Response Handling
HttpUrlConnection 会跟踪HTTP五个重定向,他会跟踪方向从一个起源到另外一个。This implementation doesn’t follow redirects from HTTPS to HTTP or vice versa(翻译不出来)
如果http 返回指示一个错误发生,getInputStream()将会抛出一个IOException.使用getErrorStream(),来读取错误的返回。头部可以正常的读取。

Posting Content
要上传数据到web服务端,需要为HttpUrlConnection配置setDoOutput(true);
最好的话,如果你知道文件大小的长度,你应该setFixedLengthStreamingMode(int),为该HttpUrlConnection设置大小。如果不知道文件或内容大小应该调用setChunkedStreamingMode(
int chunkLength),这个方法将会把上传的流分成一块一块的,如果数字过大,会有一个较大的buffer,潜在的就会浪费内存。一个较小的的块增加了bytes的数量,因为每一个块都包含一个头部。使用trunk(块),最后记得调用flush().如果没有调用上面两个方法,在httpUrlConnection的body被传输前,HttpUrlConnection将会强制缓存在内存中,这样子会浪费heap,增加延迟。

Performance
HttpUrlConnection获取到的流是没有缓冲的,大多数调用的通过流BufferedInputStream或者BufferedOutputStream,调用者只有在批量读取时可以忽视缓冲
当需要向服务器拉取大量数据或者传送大量数据给服务器,使用一个流来限制多少数据在内存中,
除非你需要整个body在内存中。
为了减少延迟,这个类可以重用相同的底层多个请求和返回

1)设置容许输出:conn.setDoOutput(true);
2)设置不使用缓存:conn.setUseCaches(false);
3)设置使用POST的方式发送:conn.setRequestMethod(“POST”);
4)设置维持长连接:conn.setRequestProperty(“Connection”, “Keep-Alive”);
5)设置文件字符集:conn.setRequestProperty(“Charset”, “UTF-8”);
6)设置文件长度:conn.setRequestProperty(“Content-Length”, String.valueOf(data.length));
7)设置文件类型:conn.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);

贴一个比较简单的异步下载图片的代码:

public class HttpUrlConnectionActivity extends Activity{

    private Button btnHttp;

    private ImageView ivBitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.httpurl_layout);

        ivBitmap = (ImageView) findViewById(R.id.ivNet);
        btnHttp = (Button) findViewById(R.id.btn);
        btnHttp.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                new HttpAsyncTask().execute(new String[]{"http://img0.imgtn.bdimg.com/it/u=1944514758,1778043660&fm=21&gp=0.jpg"});
            }
        });
    }

    class HttpAsyncTask extends AsyncTask<String, Integer, Bitmap>{
        private Bitmap bitmap;
        @Override
        protected Bitmap doInBackground(String... params) {
            try {
                URL url = new URL(params[0]);
                //新建一个URL对象
                HttpURLConnection mHttpUrlConnection = (HttpURLConnection)url.openConnection();
                //获得到HttpURLConnection对象
                mHttpUrlConnection.setDoInput(true);
                //设置为输入流
        //mHttpUrlConnection.setChunkedStreamingMode(1024);
        //在post上传中可以设置块的大小              mHttpUrlConnection.setConnectTimeout(5*1000);
        //设置超时为5秒
                mHttpUrlConnection.connect();
                // 将得到的数据转化成InputStream
                InputStream is = mHttpUrlConnection.getInputStream();
               // 将InputStream转换成Bitmap
                bitmap = BitmapFactory.decodeStream(is);
                is.close();
                //此处建议使用Buffer来读取。
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            ivBitmap.setImageBitmap(result);
        }
    }

}   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值