摘要:相关的小记在上进行网络通信,本身提供的手段是和两种。其中来自于,拥有大量灵活的。相关博文需备梯子。参数在进行网络请求时,尤其是在使用方法时,请求的参数相当重要。至于方法,直接在后跟上相应的参数即可。
HttpURLConnection相关的小记
在Android上进行网络通信,Android本身提供的手段是HttpClient和HttpURLConnection两种。其中HttpClient来自于Apache,拥有大量灵活的API。但出于一些原因Google自己开发了HttpURLConnection,并且建议从Froyo(Android 2.2,API level 8)开始使用HttpURLConnection。(相关博文, 需备梯子。)
如果这两个满足不了需求,可以考虑使用AsyncHttpClient和Volley。
既然官方这么建议,我也就乖乖地使用HttpURLConnection了。
基础对HTTP协议有一定了解的前提下,使用HttpURLConnection并没有什么难点,基本看个代码也就明白得差不多了。
HttpURLConnection conn = null; InputStream is = null; try { URL url = new URL(/* 你要的url */); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(15000); conn.setReadTimeout(10000); conn.setRequestMethod("GET"); // 按需更换 conn.setDoInput(true); // 设置此连接是否允许Input的flag // 同样还有setDoOutput(boolean) conn.connect(); int responseStatus = conn.getResponseCode(); is = conn.getInputStream(); // 获取InputStream // 做点什么 } catch (IOException e) { e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); } AndroidUtil.IO.close(is); }
你可以参考这里和HttpURLConnection的文档来学习更多的内容。
Request参数在进行网络请求时,尤其是在使用POST方法时,请求的参数相当重要。但HttpURLConnection中并没有直接设置参数的方法。
为此我查阅了下SO,可以参考这个回答来进行带有参数的POST请求。
至于GET方法,直接在url后跟上相应的参数即可。
为了方便起见,我将回答中的getQuery()方法改造了一下,使得可以根据请求方式来生成参数字符串。
/** * 将参数列表转换为HttpUrlConnection可用的参数字符串转换InputStream为String
* 参见http://stackoverflow.com/a/13486223/2369039 * * @param method 进行Http连接的方式,值为GET或POST * @param params 请求的参数列表 * @return 转换后的String * @throws UnsupportedEncodingException */ public static String getRequestQuery(String method, Listparams) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (NameValuePair pair : params) { if (first) { first = false; if ("GET".equalsIgnoreCase(method)) result.append("?"); } else result.append("&"); result.append(URLEncoder.encode(pair.getName(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(pair.getValue(), "UTF-8")); } return result.toString(); } // end static method getRequestQuery
返回Response后,时常会需要将Response中的内容转换成String。
似乎会经常使用到,所以我查找了下合适的方法后,将其写成了个可复用的方法,为自己省点心。
/** * 将InputStream中的数据读取为String
* 参见http://stackoverflow.com/a/309718/2369039 * * @param is InputStream * @param bufferSize buffer大小 * @param encoding String编码 * @return 读取出来的String * @throws IOException */ public static String is2String(InputStream is, int bufferSize,String encoding) throws IOException { Reader reader = new InputStreamReader(is, encoding); char[] buffer = new char[bufferSize]; StringBuilder out = new StringBuilder(); int rsz; while ((rsz = reader.read(buffer, 0, bufferSize)) >= 0) { out.append(buffer, 0, rsz); } return out.toString(); } /** * 以UTF-8编码读取InputStream为String * @param is InputStream * @return 读取出来的String * @throws IOException */ public static String is2String(InputStream is) throws IOException { return is2String(is, 50, "UTF-8"); }
最后提醒:不要在主线程中进行网络通信。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/12143.html
摘要:使用的网络请求是基于,我们着重说明一下。如果两种网络请求都想使用怎么办那么是一个最佳解决方案了。在网络请求方面的口碑很好,就连自己也有使用。,监控网络请求及网络错误,提升用户留存。 我们知道大多数的 Android 应用程序都是通过和服务器进行交互来获取数据的。如果使用 HTTP 协议来发送和接收网络数据,就免不了使用 HttpURLConnection 和 HttpClient,而 ...
摘要:非阻塞模型这种也很好理解,由阻塞的死等系统响应进化成多次调用查看数据就绪状态。复用模型,以及它的增强版就属于该种模型。此时用户进程阻塞在事件上,数据就绪系统予以通知。信号驱动模型应用进程建立信号处理程序时,是非阻塞的。 引言 之前的两篇文章 FastThreadLocal怎么Fast?、ScheduledThreadPoolExecutor源码解读 搞的我心力交瘁,且读源码过程中深感功...
摘要:前端小白最近面试几家公司,写点面经分享给大家,同时记录下自己的缺点以供后期补足,各个公司的开发方向不同,请各位理性看待。直接现场手敲触发的样式。数组去重如何实现如果用的话,里面如何写排序算法。对象何时被修改心态需要调整好,不紧张不匆忙。 前端小白最近面试几家公司,写点面经分享给大家,同时记录下自己的缺点以供后期补足,各个公司的开发方向不同,请各位理性看待。 问题相关 Css 布局方式有...
阅读 2329·2023-04-26 00:57
阅读 750·2021-11-25 09:43
阅读 1135·2021-11-19 09:40
阅读 1795·2021-11-11 16:55
阅读 1999·2019-08-30 15:53
阅读 3450·2019-08-30 15:52
阅读 1325·2019-08-30 14:10
阅读 3213·2019-08-30 13:22