zoukankan      html  css  js  c++  java
  • Android开发之使用Web Service进行网络编程

    使用Web Service进行网络编程

    Android应用通常都是执行在手机平台上。手机系统的硬件资源是有限的,无论是存储能力还是计算能力都有限。在Android系统上开发、执行一些单用户、小型应用是可能的,

    但对于须要进行大量的数据处理、复杂计算的应用。还是仅仅能部署在远程server上,Android应用将仅仅是充当这些应用的client。

    为了Android应用与远程server之间进行交互,能够借助子JavaRMI技术,但这要求远程server程序必须採用Java实现;也能够借助于CORBA技术。但这样的技术显得过于复杂,除此之外,Web Service是一种不错的选择。

    1.Web Service 平台概述

    Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocol,简单对象訪问协议),WSDL( Web Service Description LanguageWeb Service描写叙述语言)。UDDI(UniversalDescription, Description and Integration,统一描写叙述、发现和整合协议)。

    1.1. SOAP (简单对象訪问协议)

    SOAP (SimpleObject Access Protocol,简单对象訪问协议)是一种具有扩展性的;XML消息协议。SOAP同意一个应用程序向还有一个应用程序发送XML消息,SOAP消息是从SOAP发送者传至SOAP接收者的单路消息,不论什么应用程序均可作为发送者或接收者。SOAP仅定义消息结构和消息处理的协议,与底层的传输协议独立。因此。SOAP协议能通过HTTP, JMS SMTP协议传输。

    SOAP依赖于XML文档来构建,一条SOAP消息就是一份特定的XML文档,SOAP消息包合例如以下三个主要元素:

    Ø必需的<Envelope.../>根元素。SOAP消息相应的XML文档以该元素作为根元素。

    Ø可选的<Header../>元素。包括SOAP消息的头信息。

    Ø必需的<Body../>元素,包括全部的调用和响应信息。

    就眼下的SOAP消息的结构来看。<Envelope.../>根元素的通常仅仅能包括两个子元素,第个子元素是可选的<Header../>元素,第二个子元素是必需的<Body../>元素。

    1.2. WSDLWebService描写叙述语言)

    WSDL (WebService Description Language, Web Service描写叙述语言) 使用 XML描写叙述Web Service。包含訪问和使用WebService所必需的信息,定义该Web Service的位置、功能及怎样通信等描写叙述信息。

    一般来说。仅仅要调用者可以获取WebService相应的WSDL,就行从中了解它所提供的服务及怎样调用Web Service。由于一份WSDL文件淸地定义了三个方面的内容。

    ØWHAT部分:用于定义Web Service所提供的操作(或方法),也就是Web Service能做些什么。由WSDL中的<types. ../><message…/>、和<portTyp…/>元素定义。

    ØHOW部分:用于定义怎样訪问Web Service,包含数据格式详情和訪问Web Service操作的必要协议。

    也就是定义了怎样訪问Web Service

    ØWHERE部分:用于定义Web Service位于何处。怎样使用特定协议决定的网络地址(如URL)指定。该部分使用<service.../>元素定义。可在WSDL文件的最后部分看到<service.../>元素。

    一份WSDL文档通常可分为两个部分:

    Ø第一个部分定义了服务接口,它在WSDL中由<message.../>元素和<portType…/>两个元素组成,当中<message.../>元素定义了操作的交互方式。而<portType…/>元素里则可包括随意数量的<operation.../>元素。每一个<operation.../>元素代表一个同意远程调用的操作(即方法)。

    ØWSDL的第二个部分定义了服务实现,它在WSDL中由<binding.../>元素和 <service.../>两个元素组成,当中<binding.../>定义使用特定的通信协议、数据编码模型和底层通信协议,将Web Service服务接口定义映射到详细实现。

    <service.../>元素则包括一系列的<portType…/>子元素。< portType.../>子元素将会把绑定机制、服务訪问协议和端点地址结合在一起。

    1.3. UDDI(统一描写叙述、发现和整合协议)

    UDDI (UniversalDescription, Description and Integration,统一描写叙述、发现和整合协议)是一套信息注冊规范,它具有例如以下特点:

    Ø基于Web

    Ø分布式。

    UDDI包含一组同意企业向外注冊WebService、以使其它企业发现訪问的实现标准。

    UDDI的核心组件是UDDI注冊中心,它使用XML文件来描写叙述企业及其提供的Web Service, 通过使用UDDI, Web Service提供者能够对外注冊Web Service,从而同意其它企业来调用该企业注冊的Web ServiceWeb Service提供者通过UDDI注冊中心的Web界面。将它所供的Web Service的信息增加UDDI注冊中心,该Web Service就能够被发现和调用。

    Web Service使用者也通过UDDI注冊中心找、发现自己所需的服务。当Web Service使用者找到自己所需的服务之后。能够将自己绑定到指定的Web Service提供者。再依据该 Web Service相应的WSDL文档来调用对方的服务。

    2. 使用Android启用调用Web Service

    Java本身提供了丰富的WebService支持,比方Sun公司制定的JAX-WS 2规范,还有 Apache开源组织所提供的Axis1Axis2CXF等,这些技术不仅能够用于很方便地对外提供Web Service,也能够用于简化Web Service的client编程。

    对于手机等小型设备而言,它们的计算资源、存储资源都十分有限。因此Android应用不大可能须要对外提供Web ServiceAndroid应用通常仅仅是充当Web Service的client,调用远程Web Serice

    GoogleAndroid平台开发WebServiceclient提供了 ksoap2-android项目。但这个项目并未直接集成在Android平台中,还须要开发者自行下载。

    2.1Android应用添加ksoap2-android支持的下步骤。

    1)登录http://code.google.eom/p/ksoap2-android/网站。该站网站有介绍下载ksoap2-androi项目的方法。

    2)下载 ksoap2-android项目的 ksoap2-android-assembly-3.0.0-RC4.jar-with-dependencies. jar包。

    3)将下载的jar包放到android项目的libs文件夹下就可以。

    Android项目加入了ksoap2-android包之后,接下来借助   ksoap2-android项目来调用WebService所暴露出来的操作。

    2.2使用ksoap2-android调用Web Service操作的步驟例如以下:

    1)创建HttpTransportSE对象,该对象用于调用WebService操作。

    2)创建 SoapSerializationEnvelope对象。

    提示:从名称来看SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对 SoapSerializationEnvelope的处理比較特殊,它是HttpTransportSE调用WebService时信息的载体。client须要传入的參数,须要通过SoapSerializationEnvelope对象的bodyOut属性传给server;server响应生成的SOAP消息也通过该对象的body  Out属性来获取。

    3)创建SoapObject对象。创建该对象时须要传入所要调用WebService的命名空间、Web Service方法名。

    4)假设有參数须要传给Web Serviceserver端。调用SoapObject对象的addProperty(StringnameObject value)方法来设置參数,该方法的name參数指定參数名。value參数指定參数值。

    5)调用SoapSerializationEnvelopesetOutputSoapObject()方法。或者直接对bodyOut属性赋值,将前两步创逆的SoapObject对象设为SoapSerializationEnvelope的传出SOAP消息体。

    6)调用对象的call()方法,并以SoapSerializationEnvelope作为參数调用远程WebService

    7)调用完毕后,訪问SoapSerializationEnvelope对象的bodyln属性,该属性返回一个SoapObject对象。该对象就代表了Web Service的返回消息。解析该SoapObject对象,就可以获取调用Web Service的返回值。

    2.3实例:调用Web Service实现天气预报

    在开发天气预报的Android应用之前,首先须要找到一个能够对外提供天气预报的Web Service,通过搜索,发现http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx网站 能够对外提供天气预报的WebService。因此程序将会调用该网站的Web Service来实现天气预报。

    为了让应用界面更加美观,能够訪问http://www.webxml.com.cn/images/weather.zip下载各种天气图标,能够使用这些天气图标来美化应用。

    本程序主要须要调用例如以下三个Web Seivice操作:

    * 获取省份。

    * 依据省份获取城市。

    * 依据城市获取天气。

    为了调用上面的三个WebService应用程序提供例如以下工具类。

    publicclass WebServiceUtil

    {

       // 定义Web Service的命名空间

       staticfinal StringSERVICE_NS ="http://WebXml.com.cn/";

       // 定义Web Service提供服务的URL

       staticfinal StringSERVICE_URL =

           "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";

     

       // 调用远程Web Service获取省份列表

       publicstatic List<String> getProvinceList()

       {

           // 调用的方法

           final String methodName ="getRegionProvince";

           // 创建HttpTransportSE传输对象

           final HttpTransportSE ht =new HttpTransportSE(SERVICE_URL);

           ht.debug =true;

           // 使用SOAP1.1协议创建Envelop对象

           final SoapSerializationEnvelope envelope =

               new SoapSerializationEnvelope(SoapEnvelope.VER11);

           // 实例化SoapObject对象

           SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);

           envelope.bodyOut = soapObject;

           // 设置与.Net提供的Web Service保持较好的兼容性

           envelope.dotNet =true;   

           FutureTask<List<String>> task = new FutureTask<List<String>>(

           new Callable<List<String>>()

           {

               @Override

               public List<String> call()

                   throws Exception

               {

                   // 调用Web Service

                   ht.call(SERVICE_NS + methodName, envelope);

                   if (envelope.getResponse() !=null)

                   {

                       // 获取server响应返回的SOAP消息

                       SoapObject result = (SoapObject) envelope.bodyIn;

                       SoapObject detail = (SoapObject) result.getProperty(

                           methodName + "Result");

                       // 解析server响应的SOAP消息。

                       returnparseProvinceOrCity(detail);

                   }

                   returnnull;

               }

           });

           new Thread(task).start();

           try

           {

               return task.get();

           }

           catch (Exception e)

           {

               e.printStackTrace();

           }

           returnnull;

       }

     

       // 依据省份获取城市列表

       publicstatic List<String> getCityListByProvince(String province)

       {

           // 调用的方法

           final String methodName ="getSupportCityString";

           // 创建HttpTransportSE传输对象

           final HttpTransportSE ht =new HttpTransportSE(SERVICE_URL);

           ht.debug =true;

           // 实例化SoapObject对象

           SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);

           // 加入一个请求參数

           soapObject.addProperty("theRegionCode", province);

           // 使用SOAP1.1协议创建Envelop对象

           final SoapSerializationEnvelope envelope =

               new SoapSerializationEnvelope(SoapEnvelope.VER11);

           envelope.bodyOut = soapObject;

           // 设置与.Net提供的Web Service保持较好的兼容性

           envelope.dotNet =true;

           FutureTask<List<String>> task = new FutureTask<List<String>>(

           new Callable<List<String>>()

           {

               @Override

               public List<String> call()

                   throws Exception

               {

                   // 调用Web Service

                   ht.call(SERVICE_NS + methodName, envelope);

                   if (envelope.getResponse() !=null)

                   {

                       // 获取server响应返回的SOAP消息

                       SoapObject result = (SoapObject) envelope.bodyIn;

                       SoapObject detail = (SoapObject) result.getProperty(

                           methodName + "Result");

                       // 解析server响应的SOAP消息。

                       returnparseProvinceOrCity(detail);

                   }

                   returnnull;

               }

           });

           new Thread(task).start();

           try

           {

               return task.get();

           }

           catch (Exception e)

           {

               e.printStackTrace();

           }

           returnnull;

       }

     

       privatestatic List<String> parseProvinceOrCity(SoapObject detail)

       {

           ArrayList<String> result = new ArrayList<String>();

           for (int i = 0; i < detail.getPropertyCount(); i++)

           {

               // 解析出每一个省份

               result.add(detail.getProperty(i).toString().split(",")[0]);

           }

           return result;

       }

     

       publicstatic SoapObject getWeatherByCity(String cityName)

       {

           final String methodName ="getWeather";

           final HttpTransportSE ht =new HttpTransportSE(SERVICE_URL);

           ht.debug =true;

    nbsp;      final SoapSerializationEnvelope envelope =

               new SoapSerializationEnvelope(SoapEnvelope.VER11);

           SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);

           soapObject.addProperty("theCityCode", cityName);

           envelope.bodyOut = soapObject;

           // 设置与.Net提供的Web Service保持较好的兼容性

           envelope.dotNet =true;

           FutureTask<SoapObject> task = new FutureTask<SoapObject>(

           new Callable<SoapObject>()

           {

               @Override

               public SoapObject call()

                   throws Exception

               {

                   ht.call(SERVICE_NS + methodName, envelope);

                   SoapObject result = (SoapObject) envelope.bodyIn;

                   SoapObject detail = (SoapObject) result.getProperty(

                       methodName + "Result");

                   return detail;

               }

           });

           new Thread(task).start();

           try

           {

               return task.get();

           }

           catch (Exception e)

           {

               e.printStackTrace();

           }

           returnnull;

       }

    }

     

     

    上面的程序调用Web Service的方法还是没有改变,前面两个方法——获取系统支持的省份列表,依据省份获取城市列表——将远程Web Service返回的数据解析成List<String>后返回。这样方便Android应用使用。因为第二个方法须要返回的数据量较多,所以程序直接返回了 SoapObject 对象。

    上面的程序中调用WebService时将SoapSerializationEnvelope对象的dotNet属性设为 true——由于上面这个站点是通过.NET来对外提供WebService的,因此须要将 SoapSerializationEnvelope对象的 dotNet 属性设为 true

    有了上面的调用WebService的工具类之后,接下来能够在Activity中使用该工具类来获取天气服务信息。

    Activity使用了两个Spinner让用户选择省份、城市,当用户选择指定城市后,系统将会载入该程序的天气信息。

    该程序的界面布局代码例如以下:

    <?

    xmlversion="1.0"encoding="utf-8"?>

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

       android:orientation="vertical"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content">

       <LinearLayout

           android:layout_width="fill_parent"

           android:layout_height="wrap_content"

           android:orientation="horizontal">

           <TextView

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:hint="@string/province"/>

           <!-- 让用户选择省份的Spinner -->

           <Spinner

               android:id="@+id/province"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/> 

           <TextView

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:hint="@string/city"/>

           <!-- 让用户选择城市的Spinner -->

           <Spinner

               android:id="@+id/city"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/> 

       </LinearLayout>

       <TextView

       android:id="@+id/weatherCurrent"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"/>

       <!-- 显示今天天气的图片和文本框 -->

       <LinearLayout

           android:layout_width="fill_parent"

           android:layout_height="wrap_content">

           <ImageView

               android:id="@+id/todayWhIcon1"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <ImageView

               android:id="@+id/todayWhIcon2"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <TextView

               android:id="@+id/weatherToday"

               android:layout_width="fill_parent"

               android:layout_height="wrap_content"

               android:layout_weight="1"/>

       </LinearLayout>

       <!-- 显示明天天气的图片和文本框 -->

       <LinearLayout

           android:layout_width="fill_parent"

           android:layout_height="wrap_content">

           <ImageView

               android:id="@+id/tomorrowWhIcon1"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <ImageView

               android:id="@+id/tomorrowWhIcon2"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <TextView

               android:id="@+id/weatherTomorrow"

               android:layout_width="fill_parent"

               android:layout_height="wrap_content"

               android:layout_weight="1"/>

       </LinearLayout>

       <!-- 显示后天天气的图片和文本框 -->

       <LinearLayout

           android:layout_width="fill_parent"

           android:layout_height="wrap_content">

           <ImageView

               android:id="@+id/afterdayWhIcon1"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <ImageView

               android:id="@+id/afterdayWhIcon2"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"/>

           <TextView

               android:id="@+id/weatherAfterday"

               android:layout_width="fill_parent"

               android:layout_height="wrap_content"

               android:layout_weight="1"/>

       </LinearLayout>

     

    </LinearLayout>

     

     

     

    当程序载入时,程序会调用WebServiceUtilgetProvinceList()方法来获取省份列表,并 使用第一个Spinner载入、显示全部省份:当用户改变选择了省份之后。程序会调用 WebServiceUtilgetCityListByProvince(Stringprovince)方法来获取该省份的所有城市:当用户改变选择城市之后,程序会调用WebServiceUtilgetWeatherByCity(StringcityName)方法 获取该城市的天气。

    Activity的代码例如以下:

    publicclass GetWeatherextends Activity

    {

       private SpinnerprovinceSpinner;

       private SpinnercitySpinner;

       private ImageViewtodayWhIcon1;

       private ImageViewtodayWhIcon2;

       private TextViewtextWeatherToday;

       private ImageViewtomorrowWhIcon1;

       private ImageViewtomorrowWhIcon2;

       private TextViewtextWeatherTomorrow;

       private ImageViewafterdayWhIcon1;

       private ImageViewafterdayWhIcon2;

       private TextViewtextWeatherAfterday;

       private TextViewtextWeatherCurrent;

     

       @Override

       publicvoid onCreate(Bundle savedInstanceState)

       {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.main);

     

           todayWhIcon1 = (ImageView) findViewById(R.id.todayWhIcon1);

           todayWhIcon2 = (ImageView) findViewById(R.id.todayWhIcon2);

           textWeatherToday = (TextView) findViewById(R.id.weatherToday);

           tomorrowWhIcon1 = (ImageView) findViewById(R.id.tomorrowWhIcon1);

           tomorrowWhIcon2 = (ImageView) findViewById(R.id.tomorrowWhIcon2);

           textWeatherTomorrow = (TextView) findViewById(R.id.weatherTomorrow);

           afterdayWhIcon1 = (ImageView) findViewById(R.id.afterdayWhIcon1);

           afterdayWhIcon2 = (ImageView) findViewById(R.id.afterdayWhIcon2);

           textWeatherAfterday = (TextView) findViewById(R.id.weatherAfterday);

           textWeatherCurrent = (TextView) findViewById(R.id.weatherCurrent);

     

           // 获取程序界面中选择省份、城市的Spinner组件

           provinceSpinner = (Spinner) findViewById(R.id.province);

           citySpinner = (Spinner) findViewById(R.id.city);

           // 调用远程Web Service获取省份列表

           List<String> provinces = WebServiceUtil.getProvinceList();

           ListAdapter adapter = new ListAdapter(this, provinces);

           // 使用Spinner显示省份列表

           provinceSpinner.setAdapter(adapter);

           // 当省份Spinner的选择项被改变时

           provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener()

           {

               @Override

               publicvoid onItemSelected(AdapterView<?> source, View parent,

                   int position,long id)

               {

                   List<String> cities = WebServiceUtil

                       .getCityListByProvince(provinceSpinner.getSelectedItem()

                           .toString());

                   ListAdapter cityAdapter = new ListAdapter(GetWeather.this,

                       cities);

                   // 使用Spinner显示城市列表

                   citySpinner.setAdapter(cityAdapter);

               }

     

               @Override

               publicvoid onNothingSelected(AdapterView<?> arg0)

               {

               }

           });

           // 当城市Spinner的选择项被改变时

           citySpinner.setOnItemSelectedListener(new OnItemSelectedListener()

           {

               @Override

               publicvoid onItemSelected(AdapterView<?> source, View parent,

                   int position,long id)

               {

                   showWeather(citySpinner.getSelectedItem().toString());

               }

     

               @Override

               publicvoid onNothingSelected(AdapterView<?> arg0)

               {

               }

           });

       }

     

       privatevoid showWeather(String city)

       {

           String weatherToday = null;

           String weatherTomorrow = null;

           String weatherAfterday = null;

           String weatherCurrent = null;

           int iconToday[] =newint[2];

           int iconTomorrow[] =newint[2];

           int iconAfterday[] =newint[2];

           // 获取远程Web Service返回的对象

           SoapObject detail = WebServiceUtil.getWeatherByCity(city);     

           // 获取天气实况

           weatherCurrent = detail.getProperty(4).toString();

           // 解析今天的天气情况

           String date = detail.getProperty(7).toString();

           weatherToday = "今天:" + date.split(" ")[0];

           weatherToday = weatherToday + " 天气:" + date.split(" ")[1];

           weatherToday = weatherToday + " 气温:"

               + detail.getProperty(8).toString();

           weatherToday = weatherToday + " 风力:"

               + detail.getProperty(9).toString() + " ";

           iconToday[0] = parseIcon(detail.getProperty(10).toString());

           iconToday[1] = parseIcon(detail.getProperty(11).toString());

           // 解析明天的天气情况

           date = detail.getProperty(12).toString();

           weatherTomorrow = "明天:" + date.split(" ")[0];

           weatherTomorrow = weatherTomorrow + " 天气:" + date.split(" ")[1];

           weatherTomorrow = weatherTomorrow + " 气温:"

               + detail.getProperty(13).toString();

           weatherTomorrow = weatherTomorrow + " 风力:"

               + detail.getProperty(14).toString() + " ";

           iconTomorrow[0] = parseIcon(detail.getProperty(15).toString());

           iconTomorrow[1] = parseIcon(detail.getProperty(16).toString());

           // 解析后天的天气情况

           date = detail.getProperty(17).toString();

           weatherAfterday = "后天:" + date.split(" ")[0];

           weatherAfterday = weatherAfterday + " 天气:" + date.split(" ")[1];

           weatherAfterday = weatherAfterday + " 气温:"

               + detail.getProperty(18).toString();

           weatherAfterday = weatherAfterday + " 风力:"

               + detail.getProperty(19).toString() + " ";

           iconAfterday[0] = parseIcon(detail.getProperty(20).toString());

           iconAfterday[1] = parseIcon(detail.getProperty(21).toString());

           // 更新当天的天气实况

           textWeatherCurrent.setText(weatherCurrent);

           // 更新显示今天天气的图标和文本框

           textWeatherToday.setText(weatherToday);

           todayWhIcon1.setImageResource(iconToday[0]);

           todayWhIcon2.setImageResource(iconToday[1]);

           // 更新显示明天天气的图标和文本框

           textWeatherTomorrow.setText(weatherTomorrow);

           tomorrowWhIcon1.setImageResource(iconTomorrow[0]);

           tomorrowWhIcon2.setImageResource(iconTomorrow[1]);

           // 更新显示后天天气的图标和文本框

           textWeatherAfterday.setText(weatherAfterday);

           afterdayWhIcon1.setImageResource(iconAfterday[0]);

           afterdayWhIcon2.setImageResource(iconAfterday[1]);

       }

     

       // 工具方法,该方法负责把返回的天气图标字符串,转换为程序的图片资源ID

       privateint parseIcon(String strIcon)

       {

           if (strIcon ==null)

               return -1;

           if ("0.gif".equals(strIcon))

               return R.drawable.a_0;

           if ("1.gif".equals(strIcon))

               return R.drawable.a_1;

           if ("2.gif".equals(strIcon))

               return R.drawable.a_2;

           if ("3.gif".equals(strIcon))

               return R.drawable.a_3;

           if ("4.gif".equals(strIcon))

               return R.drawable.a_4;

           if ("5.gif".equals(strIcon))

               return R.drawable.a_5;

           if ("6.gif".equals(strIcon))

               return R.drawable.a_6;

           if ("7.gif".equals(strIcon))

               return R.drawable.a_7;

           if ("8.gif".equals(strIcon))

               return R.drawable.a_8;

           if ("9.gif".equals(strIcon))

               return R.drawable.a_9;

           if ("10.gif".equals(strIcon))

               return R.drawable.a_10;

           if ("11.gif".equals(strIcon))

               return R.drawable.a_11;

           if ("12.gif".equals(strIcon))

               return R.drawable.a_12;

           if ("13.gif".equals(strIcon))

               return R.drawable.a_13;

           if ("14.gif".equals(strIcon))

               return R.drawable.a_14;

           if ("15.gif".equals(strIcon))

               return R.drawable.a_15;

           if ("16.gif".equals(strIcon))

               return R.drawable.a_16;

           if ("17.gif".equals(strIcon))

               return R.drawable.a_17;

           if ("18.gif".equals(strIcon))

               return R.drawable.a_18;

           if ("19.gif".equals(strIcon))

               return R.drawable.a_19;

           if ("20.gif".equals(strIcon))

               return R.drawable.a_20;

           if ("21.gif".equals(strIcon))

               return R.drawable.a_21;

           if ("22.gif".equals(strIcon))

               return R.drawable.a_22;

           if ("23.gif".equals(strIcon))

               return R.drawable.a_23;

           if ("24.gif".equals(strIcon))

               return R.drawable.a_24;

           if ("25.gif".equals(strIcon))

               return R.drawable.a_25;

           if ("26.gif".equals(strIcon))

               return R.drawable.a_26;

           if ("27.gif".equals(strIcon))

               return R.drawable.a_27;

           if ("28.gif".equals(strIcon))

               return R.drawable.a_28;

           if ("29.gif".equals(strIcon))

               return R.drawable.a_29;

           if ("30.gif".equals(strIcon))

               return R.drawable.a_30;

           if ("31.gif".equals(strIcon))

               return R.drawable.a_31;

           return 0;

       }

     

     

    上面的Activity代码己经不再涉及调用WebService的代码了,仅仅是简单地调用Web Service操作,解析Web Service返回的SOAP消息包。并把SOAP消息包中的数据显示出来。

    未完待续..........

     

  • 相关阅读:
    【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
    【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包
    【bzoj2121】字符串游戏 区间dp
    【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
    【bzoj1067】[SCOI2007]降雨量 倍增RMQ
    【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
    【codeforces914G】Sum the Fibonacci FWT+FST(快速子集变换)
    【bzoj4305】数列的GCD 组合数学+容斥原理
    【bzoj5180】[Baltic2016]Cities 斯坦纳树
    【bzoj5178】[Jsoi2011]棒棒糖 主席树
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7043483.html
Copyright © 2011-2022 走看看