}
public void setVersion(String version) { Version = version; }
}
此文件中除了属性的名称需要同wsdl文件中的一致,getProperty()、getPropertyInfo()、setProperty()方法中属性的顺序需要注意意外,特别需要注意就是上边红色代码部分,一个是getCount()方法的返回值,一个是getPropertyInfo()方法第三个参数的命名空间的设置。返回值是随着属性的改变而改变的,这点一定要注意,如果当前返回值小于属性的总数,调用的过程中可能会出现数组越界的异常;命名空间也是与wsdl文件中的值对应的,如果命名空间匹配出错,会影响服务器端的处理及返回值,拿本例来讲,如果把命名空间赋值的代码注释掉,调用服务返回的结果是ERROR,而命名空间赋值匹配正确的情况下,调用服务返回的结果则是PAD IS REGISTEDS,所以一定要注意命名空间的赋值。除了命名空间的匹配外,我们还需要进行服务端与客户端对自定义类型的映射,就是那段addMapping添加映射的代码,第一个参数是服务端自定义类型参数所处的命名空间对应的引用,第二个参数是此类型参数在服务端的参数名称,第三个参数是客户端(即本地)该自定义类型的参数所对应的类型。
包括自定义类型、类型映射工作做完并都保证正确之后,再进行服务调用操作,应该就不会出现错误了。
自定义类型参数集合(downLoad)在此处代表含有自定义属性的自定义参数和自定义参数集合的调用服务操作,这里的参数为ArrayOfPEnt类型,因为它代表的是ParamEnt类型的集合,针对这种自定义类型,我们同样需要映射,既然要映射,就需要服务器端和客户端的各自的类型,而此时只有服务器端对这个类型进行了定义,客户端并没有对这个类型进行定义,所以接下来的第一件事就是定义ArrayOfPEnt类型。具体作法如下: 5、 新建ParamEnt.java文件,做法同第四步相同,这里重点说一下ArrayOfPEnt.java文件,
实现KvmSerializable接口并继承Vector
package com.example.webservicetest;
import java.util.Hashtable; import java.util.Vector;
import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo;
public class ArrayOfPEnt extends Vector
@Override
public Object getProperty(int arg0) {
return this.get(arg0); }
@Override
public intgetPropertyCount() { return this.size(); }
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { // arg2.namespace
\
arg2.name = \ arg2.type = ParamEnt.class; }
@Override
public void setProperty(int arg0, Object arg1) { this.add((ParamEnt) arg1); } }
需要注意的地方同第四步,此处不再赘述。 6、 编写MainActivity.java文件,如下:
package com.example.webservicetest;
import java.io.IOException;
import org.ksoap2.serialization.SoapObject;
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message;
import android.view.TextureView; import android.view.View;
import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
=
Button b1,b2,b3; TextView t;
private SoapObjectsoapObject = new SoapObject(); private String resultStr = \
private Handler mHandler = null; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = (TextView) findViewById(R.id.textView); b1 = (Button) findViewById(R.id.simple); b2 = (Button) findViewById(R.id.simplecom); b3 = (Button) findViewById(R.id.comlist); b1.setOnClickListener(this); b2.setOnClickListener(this); b3.setOnClickListener(this); mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0x11: t.setText(resultStr); break; case 0x12: t.setText(resultStr); break; case 0x13: t.setText(resultStr); break; default: break; } } }; }
@Override
public void onClick(View v) {
switch (v.getId()) { case R.id.simple: new Thread(){ public void run() { try { soapObject = WebServiceOp.serverTime(); resultStr = \请求无参的服务调用-->结果为:\+ soapObject.toString();
Message msg = new Message(); msg.what = 0x11; mHandler.sendMessage(msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); break; case R.id.simplecom: new Thread() { public void run() { try { soapObject = WebServiceOp.register(); resultStr = \请求自定义参数的服务调用-->结果为:\+ soapObject.toString();
Message msg = new Message(); msg.what = 0x12; mHandler.sendMessage(msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); break; case R.id.comlist: new Thread() { public void run() { try { soapObject = WebServiceOp.downLoad();
resultStr = \请求自定义参数集合的服务调用-->结果为:\+ soapObject.toString();
Message msg = new Message(); msg.what = 0x13; mHandler.sendMessage(msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); break; default: break; } } }
思来想去我还是觉得应该把这个在Activity中访问网络的问题啰嗦一下,由于android 4.0以上版本系统不支持主线程存在耗时操作(包括访问网络和大数据计算等),所以需要通过一个线程来处理,如上述代码中的红色标注部分。解决方案有很多种,最常用的为handler+thread、AsyncTask两种方式,在此不再赘述,请参考附加文档。
至此,整个项目差不多完成了,部署,测试一下。(如果出现连接超时,需要查看服务是否开启)