最近开始实践做些Android的项目,开始接触webservice就碰壁,一个小问题困扰了两天时间,在网络上找了很多资料终于调通,先做些总结。
访问webservice的基本步骤包括:
1、首先要加载”ksoap2-android-assembly-2.5.2-jar-with-dependencies“jar包,直接将该jar文件放置到项目的libs文件夹下即可。
2、下面就可以按部就班的往下进行,在java文件中创建HttpTransportSE对象,HttpTransportSE httpTransportSE=new HttpTransportSE(SERVICE_URL);,该对象主要用作调用相关webservice的一些方法,来传送数据。
2、创建SoapSerilizationEnvelope对象,并声明使用的soap协议版本,SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
3、创建并实例化SoapObject对象,用于指定需要访问webservice的方法,SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);并将其关联到envelope对象的bodyOut属性,设置envelope的兼容性-envelope.dotNet = true;。注:不知道运行其他Android版本怎样,在4.0系统中此处还要通过envelope.setOutputSoapObject(soapObject)来指定其输出,否则,在访问webservice的数据时会报异常。
4、通过HttpTransportSE的call方法来取得特定的envelope对象,httpTranstation.call(SERVICE_NS + methodName, envelope);
5、通过SoapObject result = (SoapObject) envelope.bodyIn;和SoapObject detail = (SoapObject) result.getProperty(methodName+ "Result");来取出你要访问的数据。
注意:在4.0及以上系统(其他版本未尝试)一般情况下不支持在主线程中访问网络资源,故会报错,要解决此问题就需要在主Activity的onCreate中添加如下代码StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
然后在运行APP可正常运行。
在主线程尽量不要访问网络资源,否则程序会显得不够流畅,最好在后台访问资源然后通过主线程来更新ui进程。