今天遇到个问题,由于应用服务端使用的Spring框架(xfire)的版本过低,与客户的GuideWire理赔系统接口互相调用产生了兼容性问题,根据理赔项目组的要求,我们服务端需要升级Spring版本,导致整体框架的大变动,在此基础上,手机端需要同时测试是否能够兼容升级为cxf的WebService框架的接口。实际上,这次WebService接口的变动对Android应用调用的影响并不太大,因为接口的仍然使用的是Soap协议,没有什么改变。
我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限 的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用。
下载最新的ksoap2-android-assembly-3.4.0-jar-with-dependencies.jar
因为我个人使用的是IntelliJ IDEA Ultimate 14.1.1版本。我这里的jar包就放在libs下,右键—>Add as library
然后选择Module Library(如图所示)
下面开始实现接口的调用:
首先通过同事给出的WSDL取的需要的相关信息:
命名空间、方法名、服务地址、接口名:
public static String NAME_SPACE = " http://webservice.cy.com/ ";
public static String methodName = "pushData";
public static String SERVER_URL = " http://10.100.160.89:8080/myWebservice/service/ ";
public static String INTERFACE_NAME = "myWebservice";
贴出调用接口的类:
import android.util.Log;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
/**
* 类名称: Util
* 类描述:
* 创建人: chenjinghao
* 创建时间: 2015/4/2 16:08.
*/
public class Util {
public static String callWeb(String nameSpace, String methodName,String serverURL, String interfaceName, String parameterName, String
parameterValue){
//每一次网络请求都会重新调用
String resultString = null;
// 实例化SoapObject对象
SoapObject request = new SoapObject(nameSpace, methodName);
// 在需要传参的时候添加参数
request.addProperty(parameterName, parameterValue);
// 使用soap1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
/**
* 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可
**/
HttpTransportSE ht = null;
ht = new HttpTransportSE(serverURL + interfaceName, 10*1000);
ht.debug = true;
try {
// 将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
envelope.bodyOut = request;
// 调用webService
ht.call(null, envelope);
if (envelope.getResponse() != null) {
SoapObject result = (SoapObject) envelope.bodyIn;
resultString = result.getProperty(0).toString();
Log.i("调用返回信息", resultString+"");
}else {
Log.i("调用返回信息", "调用失败,返回数据为null");
}
}catch(OutOfMemoryError e){
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
}
这样对接口调用的方法我们就封装好了。
下面就开始在我们的Activity中调用封装好的方法来调用WebService了。
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.widget.*;
import java.lang.ref.WeakReference;
public class MyActivity extends Activity {
private Button mybutton;
private static Toast toast;
private static String result;
private static String NAME_SPACE = " http://webservice.cy.com/ ";
private static String METHOD_NAME = "pushData";
private static String SERVER_URL = " http://10.100.160.89:8080/myWebservice/service/ ";
private static String INTERFACE_NAME = "myWebservice";
//静态的内部MyHandler类,继承自Handler,并添加弱引用
static class MyHandler extends Handler{
WeakReference<MyActivity> mActivity;
MyHandler(MyActivity theActivity) {
mActivity = new WeakReference<MyActivity>(theActivity);
}
@Override
public void handleMessage(Message msg) {
MyActivity myActivity = mActivity.get();
switch (msg.what) {
case 1:
TextToast(myActivity.getApplicationContext(), "接口返回数据:"+result, Toast.LENGTH_SHORT);
break;
}
super.handleMessage(msg);
}
}
MyHandler myHandler = new MyHandler(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toast = new Toast(getApplicationContext());
mybutton = (Button) findViewById(R.id.button);
mybutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callWeb();
}
});
}
public void callWeb(){
new Thread(new Runnable() {
@Override
public void run() {
result = Util.callWeb(NAME_SPACE,METHOD_NAME,SERVER_URL,INTERFACE_NAME,"参数名","参数值");
myHandler.sendEmptyMessage(1);
}
}).start();
}
/**
* 普通文本消息提示
* @param context
* @param text
* @param duration
*/
public static void TextToast(Context context,CharSequence text,int duration){
if (toast != null) {
toast.cancel();
}
toast = Toast.makeText(context,text,duration);
toast.setText(text);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/**
* 带图片消息提示
* @param context
* @param ImageResourceId
* @param text
* @param duration
*/
public static void ImageToast(Context context,int ImageResourceId,CharSequence text,int duration){
if(toast != null){
toast.cancel();
}
//创建一个Toast提示消息
toast = Toast.makeText(context, text, duration);
//设置Toast提示消息在屏幕上的位置
toast.setGravity(Gravity.CENTER, 0, 0);
//获取Toast提示消息里原有的View
View toastView = toast.getView();
//创建一个ImageView
ImageView img = new ImageView(context);
img.setImageResource(ImageResourceId);
//创建一个LineLayout容器
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.HORIZONTAL);
//向LinearLayout中添加ImageView和Toast原有的View
ll.addView(img);
ll.addView(toastView);
//将LineLayout容器设置为toast的View
toast.setView(ll);
//显示消息
toast.show();
}
}
在Activity中,声明Handler的时候,我们采用了创建一个内部的MyHandler类,继承自Handler类,并添加弱引用
这样的好处在于,不会引起内存的泄露。具体的可以百度查看相关的资料。
另外需要注意的是,在主线程中不要再使用网络请求,否则会Warn一个异常:NetworkOnMainThreadException。
这也是为什么我们使用了Handler来发送消息,并处理网络请求的原因。
原文链接: http://1.normalme.sinaapp.com/android-call-webservice-depend-on-cxf/
我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限 的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用。
下载最新的ksoap2-android-assembly-3.4.0-jar-with-dependencies.jar
因为我个人使用的是IntelliJ IDEA Ultimate 14.1.1版本。我这里的jar包就放在libs下,右键—>Add as library
然后选择Module Library(如图所示)
下面开始实现接口的调用:
首先通过同事给出的WSDL取的需要的相关信息:
命名空间、方法名、服务地址、接口名:
public static String NAME_SPACE = " http://webservice.cy.com/ ";
public static String methodName = "pushData";
public static String SERVER_URL = " http://10.100.160.89:8080/myWebservice/service/ ";
public static String INTERFACE_NAME = "myWebservice";
贴出调用接口的类:
import android.util.Log;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
/**
* 类名称: Util
* 类描述:
* 创建人: chenjinghao
* 创建时间: 2015/4/2 16:08.
*/
public class Util {
public static String callWeb(String nameSpace, String methodName,String serverURL, String interfaceName, String parameterName, String
parameterValue){
//每一次网络请求都会重新调用
String resultString = null;
// 实例化SoapObject对象
SoapObject request = new SoapObject(nameSpace, methodName);
// 在需要传参的时候添加参数
request.addProperty(parameterName, parameterValue);
// 使用soap1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
/**
* 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可
**/
HttpTransportSE ht = null;
ht = new HttpTransportSE(serverURL + interfaceName, 10*1000);
ht.debug = true;
try {
// 将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
envelope.bodyOut = request;
// 调用webService
ht.call(null, envelope);
if (envelope.getResponse() != null) {
SoapObject result = (SoapObject) envelope.bodyIn;
resultString = result.getProperty(0).toString();
Log.i("调用返回信息", resultString+"");
}else {
Log.i("调用返回信息", "调用失败,返回数据为null");
}
}catch(OutOfMemoryError e){
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return resultString;
}
}
这样对接口调用的方法我们就封装好了。
下面就开始在我们的Activity中调用封装好的方法来调用WebService了。
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.widget.*;
import java.lang.ref.WeakReference;
public class MyActivity extends Activity {
private Button mybutton;
private static Toast toast;
private static String result;
private static String NAME_SPACE = " http://webservice.cy.com/ ";
private static String METHOD_NAME = "pushData";
private static String SERVER_URL = " http://10.100.160.89:8080/myWebservice/service/ ";
private static String INTERFACE_NAME = "myWebservice";
//静态的内部MyHandler类,继承自Handler,并添加弱引用
static class MyHandler extends Handler{
WeakReference<MyActivity> mActivity;
MyHandler(MyActivity theActivity) {
mActivity = new WeakReference<MyActivity>(theActivity);
}
@Override
public void handleMessage(Message msg) {
MyActivity myActivity = mActivity.get();
switch (msg.what) {
case 1:
TextToast(myActivity.getApplicationContext(), "接口返回数据:"+result, Toast.LENGTH_SHORT);
break;
}
super.handleMessage(msg);
}
}
MyHandler myHandler = new MyHandler(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toast = new Toast(getApplicationContext());
mybutton = (Button) findViewById(R.id.button);
mybutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callWeb();
}
});
}
public void callWeb(){
new Thread(new Runnable() {
@Override
public void run() {
result = Util.callWeb(NAME_SPACE,METHOD_NAME,SERVER_URL,INTERFACE_NAME,"参数名","参数值");
myHandler.sendEmptyMessage(1);
}
}).start();
}
/**
* 普通文本消息提示
* @param context
* @param text
* @param duration
*/
public static void TextToast(Context context,CharSequence text,int duration){
if (toast != null) {
toast.cancel();
}
toast = Toast.makeText(context,text,duration);
toast.setText(text);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
/**
* 带图片消息提示
* @param context
* @param ImageResourceId
* @param text
* @param duration
*/
public static void ImageToast(Context context,int ImageResourceId,CharSequence text,int duration){
if(toast != null){
toast.cancel();
}
//创建一个Toast提示消息
toast = Toast.makeText(context, text, duration);
//设置Toast提示消息在屏幕上的位置
toast.setGravity(Gravity.CENTER, 0, 0);
//获取Toast提示消息里原有的View
View toastView = toast.getView();
//创建一个ImageView
ImageView img = new ImageView(context);
img.setImageResource(ImageResourceId);
//创建一个LineLayout容器
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.HORIZONTAL);
//向LinearLayout中添加ImageView和Toast原有的View
ll.addView(img);
ll.addView(toastView);
//将LineLayout容器设置为toast的View
toast.setView(ll);
//显示消息
toast.show();
}
}
在Activity中,声明Handler的时候,我们采用了创建一个内部的MyHandler类,继承自Handler类,并添加弱引用
这样的好处在于,不会引起内存的泄露。具体的可以百度查看相关的资料。
另外需要注意的是,在主线程中不要再使用网络请求,否则会Warn一个异常:NetworkOnMainThreadException。
这也是为什么我们使用了Handler来发送消息,并处理网络请求的原因。
原文链接: http://1.normalme.sinaapp.com/android-call-webservice-depend-on-cxf/
本文介绍如何在Android应用中使用KSOAP2库调用基于Soap协议的WebService接口,并提供了一个具体的示例,包括所需库的引入、接口调用的封装及在Activity中的调用流程。

33万+

被折叠的 条评论
为什么被折叠?



