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);
}
}
}