数据交互中的各种异步处理
终于学习到网络交互这一块了,近期做的这个项目,是关于一个旅游的,其中包括web端,Android端,服务端,这三部分的代码都是得自己敲的。感觉这里面最重要的就是关于服务端和客户端的数据交互这一块了,如何向服务端发送请求,服务端又如何发送数据到客户端,那么,关于这方面我用的最多的就是各种异步处理的了吧!
Android端:
其实这种异步有了各种可用的库之后已经不那么难了,在这里我是用了android-async-http-1.4.4.jar包,在项目中添加这个包,之后发送请求就简单了。直接上代码:
发送请求前的准备工作是把服务端要的东西我先保存起来,还有要用什么把这些东西给运过去,AsyncHttpClient asynClient=new AsyncHttpClient(); RequestParams rp=new RequestParams(); //得到点击项的用户的id 传给服务器作为要添加的朋友id rp.put("addFriId",v.getTag()+""); ApplicationUtil mApp=(ApplicationUtil) ct.getApplicationContext(); Object useId=mApp.map.get("userId"); rp.put("userId", useId);很关键的几句代码是创建AsyncHttpClient 对象,它是司机,由它开着车,把RequestParams 对象这个装载着货物的车开到服务端。而这个货物就是客户端向服务端发送请求时需要发送的参数,RequestParams 存放参数和map相似,是以键值对的方式存放的,所以在服务端可以通过key值得到value了,很方便。ApplicationUtil 是我项目中用来得到用户id的,视自己的项目而定。 接下来万事具备,只欠东风了,开始发送:
asynClient.post(Config.ADD_FRIEND, rp, new JsonHttpResponseHandler(){ public void onSuccess(JSONObject response) { super.onSuccess(response); //接受服务端返回的数据 } });asynClient.post这个方法三个参数,第一个是要请求的路径,第二个是存放要传给服务端的参数的RequestParams 对象,就是上面创建的那个。onSuccess是一个回调函数,服务端发送数据过来后,客户端在这个方法里面接受数据。与它相等的还有一个onSuccess(JSONOArray response)函数,服务端是以一个json形式返回数据的额,这里面又包括json数据的解析了,这里就不多说了。返回的json是对象,还是数组就具体的去实现它的哪个回调函数。
异步任务请求图片:
先上代码再解释。//异步加载图片
class DownImageAsync extends AsyncTask<String, Void, Bitmap>{ private ImageView img; public DownImageAsync(ImageView img){ this.img=img; } Bitmap bitmap=null; protected Bitmap doInBackground(String... u) { try { URL url=new URL(u[0]); try { InputStream is = url.openConnection().getInputStream(); bitmap=BitmapFactory.decodeStream(is); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } return bitmap; } protected void onPostExecute(Bitmap result) { super.onPostExecute(result); img.setImageBitmap(result); } }自定义一个类继承AsyncTask类,继承后重写它的几个方法,doInBackground()请求,onPostExecute()请求完成后执行,还有一个方法是请求前执行的额,我们可以在自己项目中做相应的事。值得一提的是doInBackground()方法中的几个参数,是可以自己定义的,在这里我是第一个是请求的路径,第二个不需要,第三个返回的结果是一个bitmap。 String... u这种写法表示该方法的参数是不定的,URL url=new URL(u[0])这是表示该方法中几个参数中的第一个参数。接下来就是执行了:new
DownImageAsync(holder.icon).execute(Config.DOWOLOAD_ICON+map.get("icon"));这里我在继承AsyncTask的类中添加了一个构造函数,这是我自己项目的需要。
web端:
web端异步请求主要是在web前端,用异步请求达到刷新局部页面的效果。用js代码实现。
<script type="text/javascript"> var xmlhttp; if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }else{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } function doAsyncTask(method,url,params,fun){ xmlhttp.open(method, url, true,fun); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(params); xmlhttp.onreadystatechange=fun; } function loadData(){ var params="fromWeb"; doAsyncTask("POST","/TravelMVC/DynamicNoteAction.action?opreation=dynamicList",params,reponseHandle); } function reponseHandle(){ if(xmlhttp.status==200&&xmlhttp.readyState==4){ //大小写要区分 //alert(xmlhttp.responseText); /*需要将对应div属性重新显示 */ document.getElementById("response").style.display="inline"; document.getElementById("edit_box").style.display="none"; document.getElementById("myFriend").style.display="none"; document.getElementById("response").innerHTML=xmlhttp.responseText; } } </script>这里主要是利用xmlhttp这个对象。
if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }else{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");这个判断是用来兼容不同的浏览器,因为像ie5,ie6是不支持window.XMLHttpRequest的,但是就目前而言,用window.XMLHttpRequest就可以满足了。需要提到几个重要的方法,xmlhttp.open(method, url, fun); method为提交的方法,如果提交的方法是post的话,需要添加xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
这句话。url为请求的路径,fun为回调函数。回调函数中xmlhttp.status==200为状态码;
xmlhttp.readyState有几种状态,从0到4发生变化。
0:请求未初始化
1:服务器连接已建立
2:请求已接收
3:请求处理中
4:请求已完成,且响应已就绪
以上就是用到的几种异步处理的例子。在实在的项目里是非常实用的,而且也非常方便使用。
相关推荐
yangkang 2020-11-09
lbyd0 2020-11-17
sushuanglei 2020-11-12
85477104 2020-11-17
KANSYOUKYOU 2020-11-16
wushengyong 2020-10-28
lizhengjava 2020-11-13
星月情缘 2020-11-13
huangxiaoyun00 2020-11-13
luyong0 2020-11-08
腾讯soso团队 2020-11-06
Apsaravod 2020-11-05
PeterChangyb 2020-11-05
gaobudong 2020-11-04
wwwjun 2020-11-02
gyunwh 2020-11-02
EchoYY 2020-10-31
dingyahui 2020-10-30