Android 关于异步Http请求,以及编码问题
大家都知道可以使用一个继承了AsyncTask的类去实现异步操作,再有个Http请求的类就可以解决了,现在我说下里面的细节问题,比如长时间无反应,编码问题,以及一些HTML相关的处理。
首先说下长时间无反应的问题,AsyncTask有个get方法,
/**
* Waits if necessary for at most the given time for the computation
* to complete, and then retrieves its result.
*
* @param timeout Time to wait before cancelling the operation.
* @param unit The time unit for the timeout.
*
* @return The computed result.
*
* @throws CancellationException If the computation was cancelled.
* @throws ExecutionException If the computation threw an exception.
* @throws InterruptedException If the current thread was interrupted
* while waiting.
* @throws TimeoutException If the wait timed out.
*/
public final Result get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
return mFuture.get(timeout, unit);
}
可以看到调用此方法会有异常情况,可以在异常情况的时候处理,其实这个分的很细了,有网络异常,执行异常,超时异常,可以参考下面的代码去实现,会调用AsyncTask的cancel(boolean flag) 方法取消操作。
ArticleTask task = new ArticleTask();
task.execute(ARTITLC_URL);
//超过5s钟没有执行完成,取消此异步操作
try {
task.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
task.cancel(false);
dialog.dismiss();
}
然后说下如果是请求的html响应,如何处理HTML标签,这里是简单的处理,详细的还要用别的方法,以后补充吧。下面的代码基本能说明问题了。
//去除html标签
Spanned spanned = Html.fromHtml(result);
TextView textView = new TextView(MainActivity.this);
textView.setText(spanned);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
//是返回中的a标签生成链接
textView.setMovementMethod(new LinkMovementMethod());
最后说下传递过程中的编码问题,其实主要是针对中文的。如果有参数,参数要转码,返回的内容也要转码,所以要涉及到两个地方,下面的代码注释应该可以说清楚了。最开始没注意,结果乱码,后来使用 result=new String(result.getBytes("ISO-8859-1"),"utf-8"); 也解决了,不过看下面的方法更方便。 完整的代码可以参考这里
// 封装表单
if (null != params && !params.isEmpty()) {
List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
for (Map.Entry<String, Object> entry : params.entrySet()) {
String name = entry.getKey();
String value = entry.getValue().toString();
BasicNameValuePair pair = new BasicNameValuePair(name, value);
parameters.add(pair);
} try {
//此处为了避免中文乱码,保险起见要加上编码格式
UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(
parameters, encoding);
post.setEntity(encodedFormEntity);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d("shang", "UnsupportedEncodingException");
} }
try {
HttpResponse response = client.execute(post);
if(HTTP_STATUS_OK == response.getStatusLine().getStatusCode()) {
//获取服务器请求的返回结果,注意此处为了保险要加上编码格式
result = EntityUtils.toString(response.getEntity(), encoding);
} else {
throw new Exception("Invalide response from API" + response.toString());
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
下面还有个别人的解决办法,不过没解决我当时的问题,也列出来吧,有些地方还是可以借鉴的。
public Map<String, Object> CreateNote(int albumId, String title,
String remark) {
String noteId = "";
Map<String, Object> map = new HashMap<String, Object>();
try {
HttpParams parms = new BasicHttpParams();
parms.setParameter("charset", HTTP.UTF_8);
HttpConnectionParams.setConnectionTimeout(parms, 8 * 1000);
HttpConnectionParams.setSoTimeout(parms, 8 * 1000);
HttpClient httpclient = new DefaultHttpClient(parms);
HttpPost httppost = new HttpPost(ConfigHelper.CreateUri);
httppost.addHeader("Authorization", mToken);
httppost.addHeader("Content-Type", "application/json");
httppost.addHeader("charset", HTTP.UTF_8); JSONObject obj = new JSONObject();
obj.put("title", title);
obj.put("categoryId", mCategoryId);
obj.put("sourceUrl", GetSourceUri()); JSONArray arr = new JSONArray(); arr.put(DateFormat.format("yyyyMM",Calendar.getInstance(Locale.CHINA)));
obj.put("tags", arr);
obj.put("content", remark);
httppost.setEntity(new StringEntity(obj.toString(), HTTP.UTF_8));
HttpResponse response;
response = httpclient.execute(httppost);
int code = response.getStatusLine().getStatusCode();
if (code == ConstanDefine.ErrorCode.SuccOfHttpStatusCode) {
String rev = EntityUtils.toString(response.getEntity());
obj = new JSONObject(rev);
noteId = obj.getString("id");
map.put("return_code", "0");
map.put("content", rev);
}
} catch (Exception e) {
if (map.containsKey("return_code")) {
map.remove("return_code");
}
map.put("return_code", "1");
}
return map;
}
Android 关于异步Http请求,以及编码问题的更多相关文章
- Android中的异步网络请求
本篇文章我们来一起写一个最基本的Android异步网络请求框架,借此来了解下Android中网络请求的相关姿势.由于个人水平有限,文中难免存在疏忽和谬误,希望大家可以指出,谢谢大家:) 1. 同步网络 ...
- Android Asynchronous Http Client-Android异步网络请求客户端接口
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...
- ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- (转)ArcGIS Runtime for Android 使用异步GP服务绘制等值线
关于基于Android上ArcGIS Server GP服务的调用,已经有前辈给出了很好的例子: http://blog.csdn.net/esrichinacd/article/details/92 ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
- Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载之Android-Universal-Image-Loader(转)
今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...
- Android高效异步图片加载框架
概述 Android高效异步图片加载框架:一个高效的异步加载显示的图片加载框架,同时具备图片压缩,缓存机制等特性. 详细 代码下载:http://www.demodashi.com/demo/1214 ...
- 基于netty的异步http请求
package com.pt.utils; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; im ...
随机推荐
- oracle 数据库中,应用程序里的连接探測语句的正确使用
oracle 数据库中,应用程序里的连接探測语句的正确使用 本文为原创文章.转载请注明出处:http://blog.csdn.net/msdnchina/article/details/3851376 ...
- Android——Activity生命周期(转)
Activity生命周期 子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细 ...
- 分布式模式之Broker模式(转)
问题来源: 创建一个游戏系统,其将运行在互联网的环境中.客户端通过WWW服务或特定的客户端软件连接到游戏服务器,随着流量的增加,系统不断的膨胀,最终后台数据.业务逻辑被分布式的部署.然而相比中心化的系 ...
- Linux(centOS)手动安装删除Apache+MySQL+PHP+Memcached原创无错版
=================== 第一步:Apache安装 =================== 下载 去 http://www.apache.org 自己找最新的 国内有很多镜像点例如人人和 ...
- 集中精力的重要性(The Importance of Focus)
集中精力的重要性(The Importance of Focus) 在当今激烈竞争的经济中,你需要集中精力使得你公司的独特方面精益求精.并且你需要每天将精力集中在改进你的公司上.通过终极外包,单干型企 ...
- 关于Unity5.5中2D动画的制作
1.首先要创建一个精灵 GameProject--2Dproject--Sprite 叫bird 2.给这个精灵附加纹理,并让它显示自己想让它显示的场景层中,一般它的静止纹理就是动画的第一张图片 3. ...
- 23SpringMvc_各种参数绑定方式-就是<input那种
本篇博文转载自http://www.cnblogs.com/HD/p/4107674.html: SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controlle ...
- hdu 1257 最少拦截系统(动态规划 / 贪心)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- [转]Oracle dbms_random函数用法快速生成多条测试数据
Java 随机生成中文姓名,手机号,邮编,住址:http://blog.csdn.net/xiaokui_wingfly/article/details/45913885 Java 批量随机生成身份证 ...
- MathType二次偏导怎么表示
求导以及求偏导运算在数学中是很重要的一个部分,尤其是在高等数学中,基本都由函数的导数与偏导组成,很多公式定理也是关于这方面的,如果少了这一部分,数学将会黯然失色.因此在文档中涉及到这些内容时,必然会少 ...