android webService 异步访问
2013-09-03 09:06
295 查看
android 使用webservices 需要注意几个问题,这也是我在项目中遇到的,总结一下,和大家分享
1.在AndoirdManifest.xml添加网络访问权限。
2.android访问webServices的代码编写。
3.android使用webService的代码不能放在主线程(uI)线程。如果必须要放在主线程可以使用StrictMode。下面具体说明。
4.android使用webService放在后台现场执行的方法。
5.需要线程返回值的方法。
下面对上面的问题加以说明
1.在AndroidManifest.xml添加
<uses-permission android:name="android.permission.INTERNET" />
2.android使用webServices需要使用第三方jar。我在项目中使用的是通用的ksoap2 (具体文件名为:ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar)
请求服务的时候,在ksoap2中最低需要三个参数。
1) 请求服务的Url
2) 服务的命名空间
3) 服务的方法名称
一般来说知道Url之后,通过分析wsdl可以知道2,3 两个参数。
构造请求服务的代码块如下:
public String requestServer(String uId) {
try { SoapObject rpc = new SoapObject(http://tempuri.org/, getDeviceId());//getDeviceId是调用服务的方法名称 rpc.addProperty("deviceid", uId); //设置请求参数 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut = rpc; envelope.dotNet = true; envelope.setOutputSoapObject(rpc); HttpTransportSE ht = new HttpTransportSE(WEBSERVICE_URL,5000); //WEBSERVICE_URL是请求webServices的url ht.debug = true; ht.call(SOAP_ACTION, envelope); Object obj = (Object)envelope.getResponse(); if(obj !=null){ return obj.toString(); } return "" ; }catch (IOException e) { e.printStackTrace(); } return ""; }}
上面的这段代码就是请求webservices 的代码。在我本机中是可以用的代码。
3 如果把这个段代码放在onCreate方法内部执行,初始化请求数据的时候,系统肯定报错。打印异常。这是因为,像请求网络这种费时操作不能放在主线程执行。但是如果必须放在主线程执行可以使用StrictMode
具体方法如下:
在onCreate方法开始处添加如下代码:
try{ int applicationFlags = this.getApplicationInfo().flags; if ((applicationFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build()); }}catch (Throwable throwable) { Log.v("StrictMode", "... is not available. Punting..."); }//添加异常捕获是因为在android低版本是不支持StricMode的。
添加完这段代码之后,在主线程内部运行请求webservices代码,就不会出错了。但是在具体的项目,比较好的做法,还是使用多线程。就是将费时的操作,单独放在一个线程内部执行。
我的实现思路是:
1.发个消息。
2.handler接受消息后,启动线程,执行请求webServices操作
具体实现的代码如下:
Message msg = handler.obtainMessage(); msg.what = 111; //具体数值可以自己任意设置。我再次随便设置111 handler.sendMessageDelayed(msg,500)
处理消息的handler代码:
public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what==111) WebServicesTask task = new WebServicesTask(); String result = ""; try { task.execute("idxxx"); //设置请求参数 result = task.get(5000, TimeUnit.MILLISECONDS); //获取返回值,设置超时时间。 }catch (InterruptedException e) { e.printStackTrace(); result= ""; } catch (ExecutionException e) { e.printStackTrace(); result= ""; } catch (TimeoutException e) { e.printStackTrace(); result= ""; } } }
WebServicesTask类是一个AsyncTask ,之所以用Task有两个原因
1.异步操作(后台)。
2.线程操作完毕之后,返回值。
WebServicesTask类的代码如下:
public class WebServicesTask extends AsyncTask<String,Integer,String>{ private Context mContext ; public WebServicesTask(){ //nothing to do } @Override protected void onPreExecute(){ //nothing to do } @Override protected String doInBackground(String... params) { return requestServer(params[0]) ;//返回webServices请求的值。 } @Override protected void onProgressUpdate(Integer... progress) { //nothing to do } @Override protected void onPostExecute(String result) { //nothing to do } }
至此android请求webServices,异步操作,现场返回,介绍完毕。代码部分是我自己手动输入的。如果有任何错误,请留言指出,希望大家共同讨论。相互学习。谢谢!!!
相关文章推荐
- android客户端程序访问服务器端webservice,几篇不错的文章!
- 在Android中访问WebService接口的方法
- Android端访问WebService获取数据
- android访问php webservice简单一例
- Android 3.0 访问WebService 出现 android.os.NetworkOnMainThreadException异常
- android怎么访问天气webservice,用网上找的链接都不行啊
- 安卓访问webservice出现android.os.NetworkOnMainThreadException异常
- android ksoap2 访问webservice,连续两次调用时,第二次调用异常(转)
- android 访问 webservice 获取信息
- android json访问php webservice
- android访问webService
- android使用soap协议访问webservice实现天气预报功能
- android中webservice请求的异步回调封装(一)
- Android低阶之【chapter - 6】Handler结合网络访问的使用方法,通过Handler实现异步网络请求
- ASP.NET MVC中使用ASP.NET AJAX异步访问WebService
- Android通过WebService访问SQL Server无法显示数据
- 在Android中访问WebService接口
- android访问webservice小问题
- 访问WebService 出现 android.os.NetworkOnMainThreadException异常
- Android:服务器访问WebService的使用