Android平台调用Web Service:演示样例

近期在学习Android,随着移动设备的流行,当软件走上商业化的道路。为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛。懂点Android。管理起来easy些。

Android学起来也简单,封装的更好了,一个个的控件,像是又回到了VB的赶脚。

以下将通过一个演示样例解说怎样在Android平台调用Web Service。

我们使用互联网现成的Webservice。供查询手机号码归属地的Web
service,它的WSDL为http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

1)新建Androidproject。引入上面下载的ksoap2-android类库

在Android平台调用WebService须要依赖于第三方类库ksoap2。它是一个SOAP Webserviceclient开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP)。

而在Android平台中我们并不会直接使用ksoap2。而是使用ksoap2android。KSoap2 Android 是Android平台上一个高效、轻量级的SOAP开发包

2)编写布局文件res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="5dip"
    android:paddingLeft="5dip"
    android:paddingRight="5dip"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="手机号码(段):"
    />
    <EditText android:id="@+id/phone_sec"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPhonetic"
        android:singleLine="true"
        android:hint="比如:1398547"
    />
    <Button android:id="@+id/query_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="查询"
    />
    <TextView android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|center_vertical"
    />
</LinearLayout>  

3)编写MainActivity类

/**
 * Android平台调用WebService(手机号码归属地查询)
 *
 */
public class MainActivity extends Activity {
    private EditText phoneSecEditText;
    private TextView resultView;
    private Button queryButton;  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  

 // 强制在UI线程中操作
           StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
       .detectDiskReads().detectDiskWrites().detectNetwork()
        .penaltyLog().build());

        StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
       .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
        .build());

        phoneSecEditText = (EditText) findViewById(R.id.phone_sec);
        resultView = (TextView) findViewById(R.id.result_text);
        queryButton = (Button) findViewById(R.id.query_btn);  

        queryButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 手机号码(段)
                String phoneSec = phoneSecEditText.getText().toString().trim();
                // 简单推断用户输入的手机号码(段)是否合法
                if ("".equals(phoneSec) || phoneSec.length() < 7) {
                    // 给出错误提示
                    phoneSecEditText.setError("您输入的手机号码(段)有误。");
                    phoneSecEditText.requestFocus();
                    // 将显示查询结果的TextView清空
                    resultView.setText("");
                    return;
                }
                // 查询手机号码(段)信息
                getRemoteInfo(phoneSec);
            }
        });
    }  

    /**
     * 手机号段归属地查询
     *
     * @param phoneSec 手机号段
     */
    public void getRemoteInfo(String phoneSec) {
        // 命名空间
        String nameSpace = "http://WebXml.com.cn/";
        // 调用的方法名称
        String methodName = "getMobileCodeInfo";
        // EndPoint
        String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
        // SOAP Action
        String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";  

        // 指定WebService的命名空间和调用的方法名
        SoapObject rpc = new SoapObject(nameSpace, methodName);  

        // 设置需调用WebService接口须要传入的两个參数mobileCode、userId
        rpc.addProperty("mobileCode", phoneSec);
        rpc.addProperty("userId", "");  

        // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本号
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);  

        envelope.bodyOut = rpc;
        // 设置是否调用的是dotNet开发的WebService
        envelope.dotNet = true;
        // 等价于envelope.bodyOut = rpc;
        envelope.setOutputSoapObject(rpc);  

        HttpTransportSE transport = new HttpTransportSE(endPoint);
        try {
            // 调用WebService
            transport.call(soapAction, envelope);
        } catch (Exception e) {
            e.printStackTrace();
        }  

        // 获取返回的数据
        SoapObject object = (SoapObject) envelope.bodyIn;
        // 获取返回的结果
        String result = object.getProperty(0).toString();  

        // 将WebService返回的结果显示在TextView中
        resultView.setText(result);
    }
}  

注意点1nameSpace、methodName 、EndPoint和SOAP
Action
信息。都能够在WSDL中得到。

注意点2调用WebService接口方法须要传入的參数时。參数名称要和WSDL中描写叙述的一致。

网上有些资料说在须要传入多个參数时,仅仅要多个參数的顺序与WSDL中參数出现的顺序一致就可以。名称并不须要和WSDL中的一致,但实际測试发现,大多数情况下并不可行。

注意点3 本例中调用WebService后返回的结果例如以下所看到的:

<?

xml version="1.0"encoding="utf-8"?

>

<string xmlns="http://WebXml.com.cn/">1398547:贵州贵阳贵州移动黔中游卡</string>

这里明明返回的是xml格式的内容,为什么我们不须要通过解析xml来获取我们须要的内容呢?事实上:

//获取返回的数据

SoapObject object = (SoapObject) envelope.bodyIn;

ksoap2可以将返回的xml转换成SoapObject对象。然后我们就行通过操作对象的方式来获取须要的数据了。

注意点4本例中仅仅返回了一个值。但有些WebService会返回多个值该怎么获取?获取方法与本例全然一样,仅仅是须要注意的是假设是返回多个值。通过第100代码object.getProperty(0);得到的可能仍然是一个SoapObject。

不断地调用getProperty()方法;总能得到你想要的所有结果。

4)在AndroidManifest.xml中配置加入訪问网络的权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.liufeng.ws.activity"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>  

    <uses-sdk android:minSdkVersion="4" />  

    <!-- 訪问网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>  

5)执行结果

源代码下载

http://download.csdn.net/detail/tcl_6666/7365311

时间: 2024-12-25 20:51:34

Android平台调用Web Service:演示样例的相关文章

Android平台调用Web Service:示例

最近在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定需要支持Android的,所以开始接触了Android,不过只了解皮毛就好,因为我们要做管理者嘛,懂点Android,管理起来容易些. Android学起来也简单,封装的更好了,一个个的控件,像是又回到了VB的赶脚. 下面将通过一个示例讲解如何在Android平台调用Web Service.我们使用互联网现成的Webservice,供查询手机号码归属地的Web service,它的WSDL为http://we

Android平台调用Web Service:线程返回值

接上文 前文中的遗留问题 对于Java多线程的理解,我以前仅仅局限于实现Runnable接口或者继承Thread类,然后重写run()方法,最后start()调用就算完事,但是一旦涉及死锁以及对共享资源的访问和随时监控线程的状态和执行顺序和线程返回值等就不行了. Callable 和 Future 简介 Callable接口代表一段可以调用并返回结果的代码;Future接口表示是执行异步任务时的状态.返回值等信息.所以说Callable用于产生结果,Future用于获取结果. 1. Callab

Android平台调用Web Service:引入线程

接上文 遗留问题 MainActivity的onCreate方法中如果没有有这段代码: // 强制在UI线程中操作 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Bu

Android之——多线程下载演示样例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明白要求将耗时的操作放到一个子线程中运行,文件的下载无疑是须要耗费时间的.所以要将文件的下载放到子线程中运行. 以下,我们一起来实现一个Android中利用多线程下载文件的小样例. 二.服务端准备 在这个小样例中我下面载有道词典为例.在网上下载有道词典的安装包,在eclipse中新建项目web.将下载

Android - 标准VideoView播放演示样例

标准VideoView播放演示样例 本文地址: http://blog.csdn.net/caroline_wendy 在Android SDK中的ApiDemos内, 提供标准播放视频的代码,使用VideoView实现简单的视频播放功能. 代码例如以下: public class VideoViewDemo extends Activity { /** * TODO: Set the path variable to a streaming video URL or a local media

android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用户操作点击事件,演示样例中展示单击时取出主键Id和其它内容. 4.响应用户操作长按事件,演示样例中展示长按时依据主键Id来编辑和删除数据. 5.表现层与数据处理层分开,不依赖于cursor(使用cursor不易表现和业务分离),支持接口编程. 6.使用数据库处理框架AHibernate灵活操作sql

CountDownTimer完整具体演示样例

MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; /** * Demo演示样例: * CountDownTim

PopupMenu的演示样例

弹出菜单是停靠在一个View上的一个模式菜单. 假设View对象下方有空间,那么弹出菜单将显示在停靠对象的下方,否则会显示在上方. 这是很实用的: 源代码地址:http://download.csdn.net/detail/u013922681/8951537 文章引用: mod=viewthread&tid=83489">1.Android 关于PopupMenu的演示样例 2.Android应用中菜单(Menu)的位置显示问题 源代码: MainActivity.java pa

Python Web框架Tornado的异步处理代码演示样例

1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口及严格的MVC开发模式,但能够提供主要的web server功能.故它是轻量级的:它借助non-blocking and event-driven的I/O模型(epoll或kqueue)实现了一套异步网络库,故它是高性能的. Tornado的轻量级+高性能特性使得它特别适用于提供web api的场合