a284266978的专栏

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

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

{private Button btnHttp;private ImageView ivBitmap;(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() {(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;@Overrideprotected Bitmap doInBackground(String… params) {try {URL url = new URL(params[0]);//新建一个URL对象HttpURLConnection mHttpUrlConnection = (HttpURLConnection)url.openConnection();//获得到HttpURLConnection对象mHttpUrlConnection.setDoInput(true);mHttpUrlConnection.connect();// 将得到的数据转化成InputStreamInputStream is = mHttpUrlConnection.getInputStream();// 将InputStream转换成Bitmapbitmap = BitmapFactory.decodeStream(is);is.close();//此处建议使用Buffer来读取。} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bitmap;}(Bitmap result) {ivBitmap.setImageBitmap(result);}}}

出门走好路,出口说好话,出手做好事。

a284266978的专栏

相关文章:

你感兴趣的文章:

标签云: