Android调用基于cxf的WebService接口

本文介绍如何在Android应用中使用KSOAP2库调用基于Soap协议的WebService接口,并提供了一个具体的示例,包括所需库的引入、接口调用的封装及在Activity中的调用流程。
今天遇到个问题,由于应用服务端使用的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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值