因为项目里要用,所以才研究了一下,虽然对webservice和android都不怎么会,但是不管怎么说,研究出下面几个例子能满足需要了。这里调用方法的参数和返回值都是字符串,如果需要复杂对象参数,那看另外一篇博客《android调用webservice方法,参数或返回值使用服务器端类》

首先看服务器端提供的方法,这里就不看方法的实现了,看一下接口:

/**
 * SERVICE_URL:http://192.168.1.101:8080/TestWsImplService/TestWsImpl
 * SERVICE_NAMESCAPE:http://impl.webservices.yinke.com/
 * 测试服务,包含两个方法,一个返回单个字符串,一个返回字符串数组
 * @author Tsingheng
 */
@Local
@WebService
public interface TestWs {
    /**
     * 返回单个字符串测试方法
     * @param testStr 字符串参数,将包含在返回结果中
     * @return 返回单个字符串
     */
    String test(String testStr);
    /**
     * 返回字符串数组测试方法
     * @return 返回字符串数组
     */
    String[] arrayTest();
}

这里有两个方法,方法介绍都有注释,我就不多说了。然后来看android的程序,这里需要使用ksoap2-android-assembly,百度一下可以找到很多下载,我的资源里也有,不需要积分的。把该Jar文件复制到项目根目录的libs目录下,如果没有就自己建,然后不需要做其他的什么操作了。下面看程序:

要调用服务器端的方法就需要网络通信,那就需要有网络权限,在AndroidManifest.xml中加入<uses-permission android:name="android.permission.INTERNET"/>

然后建个类保存webservice的相关常量信息

public class ServiceUtil {
	public static final String SERVER_IP = "192.168.1.101:8080";
	public static final String SERVICE_NS = "http://impl.webservice.yinke.com/";
	public static final String TEST_SERVICE_URL = "http://" + SERVER_IP + "/TestWsImplService/TestWsImpl";
	public static final String TEST_METHOD = "test";
	public static final String ARRAY_TEST_METHOD = "arrayTest";
}

然后调用webservice方法是要用到SoapObject对象,我这里封装了几个方法,是让其他几个做客户端的同学用着方便,我在网上是没找到这么写的,我也还是个学生党,不知道这样做行不行,反正是测试没问题,别人用着也方便。如果同学们觉得好用可以用,如果有更好的方案还希望不吝赐教哦。

public class SoapUtil {
	public static SoapObject buildSoapObject(String methodName) {
		SoapObject soapObject = new SoapObject(ServiceUtil.SERVICE_NS,
				methodName);
		return soapObject;
	}

	private static SoapObject resultSoapObject(String serviceUrl,
			SoapObject soapObject) throws IOException, XmlPullParserException {
		HttpTransportSE ht = new HttpTransportSE(serviceUrl);
		ht.debug = true;
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		envelope.bodyOut = soapObject;
		ht.call(null, envelope);
		if (envelope.getResponse() != null) {
			SoapObject resultSoapObject = (SoapObject) envelope.bodyIn;
			return resultSoapObject;
		}
		return null;
	}
	
	public static String getResultString(String serviceUrl,
			SoapObject soapObject) throws IOException, XmlPullParserException{
		SoapObject resultSoapObject = resultSoapObject(serviceUrl, soapObject);
		if (resultSoapObject != null) return String.valueOf(resultSoapObject.getProperty(0));
		return null;
	}
	
	public static String[] getResultArray(String serviceUrl,
			SoapObject soapObject) throws IOException, XmlPullParserException{
		SoapObject resultSoapObject = resultSoapObject(serviceUrl, soapObject);
		if (resultSoapObject != null){
			String[] result = new String[resultSoapObject.getPropertyCount()];
			for(int i = 0; i < resultSoapObject.getPropertyCount(); i++){
				result[i] = String.valueOf(resultSoapObject.getProperty(i));
			}
			return result;
		}
		return null;
	}
	
}

第一个方法是创建SoapObject对象,需要参数为调用的方法的名称,第二个方法是得到webservice方法的返回结果,需要的参数是服务的url和创建的soap对象,为了方便别人使用,就做了后面两个方法可以直接得到字符串值和字符串数组值。

然后看一下调用返回单个字符串的测试,让返回的字符串显示在activity的TextView上

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/testString"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="@dimen/padding_medium"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
</LinearLayout>
public class MainActivity extends Activity {

	private TextView testString;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		testString = (TextView) super.findViewById(R.id.testString);

		try {
			stringTest();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//测试调用getResultString方法,返回值为单个字符串。
	private void stringTest() throws IOException, XmlPullParserException {
		// 创建SoapObject对象
		SoapObject stringSoapObject = SoapUtil
				.buildSoapObject(ServiceUtil.TEST_METHOD);
		
		//如果调用的方法需要参数,第一个参数使用arg0,arg1,...
		stringSoapObject.addProperty("arg0", "我调用了返回单个字符串的方法!");
		//stringSoapObject.addProperty("arg1", "value1");
		
		testString.setText(SoapUtil.getResultString(ServiceUtil.TEST_SERVICE_URL, stringSoapObject));
	}

}

然后看一下运行结果

android studio string后面添加String android studio输出字符串_webservice

然后测试一下返回字符串数组的,在界面上动态添加textView,来显示得到的结果

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


</LinearLayout>

 

public class MainActivity extends Activity {

	private LinearLayout linaerLayout;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		linaerLayout = (LinearLayout) super.findViewById(R.id.linearLayout);
		LayoutParams	leftlayoutlp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
		try {
			String[] resultTexts = arrayTest();
			for(String text : resultTexts){
				TextView textView = new TextView(this);
				textView.setLayoutParams(leftlayoutlp);
				textView.setText(text);
				linaerLayout.addView(textView);
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//测试调用getResultArray方法,返回值为字符串数组。
	private String[] arrayTest() throws IOException, XmlPullParserException{
		SoapObject arraySoapObject = SoapUtil
				.buildSoapObject(ServiceUtil.ARRAY_TEST_METHOD);
		String[] result = SoapUtil.getResultArray(ServiceUtil.TEST_SERVICE_URL, arraySoapObject);
		return result;
	}
}

结果

android studio string后面添加String android studio输出字符串_service_02

OVER,谢谢您的阅读。