Android 调用WebService笔记

参考资源:

http://blog.csdn.net/pi9nc/article/details/9297085


WebServiceUtil.java

package com.example.myweather;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class WebServiceUtil {
	/*
	 * eg:
	 * <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getRegionProvince xmlns="http://WebXml.com.cn/" />
  </soap:Body>
</soap:Envelope>*/
	
	static final String SERVICE_NS = "http://WebXml.com.cn/";//xmlns   namespace
	static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
	
	/*输入参数:无,返回数据:一维字符串数组 String()
		结构:用英文逗号分割的省份(直辖市、地区)和对应ID。示例:
		'VB
			Array(0) = "上海,31112"
			……
			……
			Array(n) = "城市/地区
	*/
	//
	public static List<String> getProvinceList(){
		//<getRegionProvince xmlns="http://WebXml.com.cn/" />
		final String methodName = "getRegionProvince";
		
		//step1 --
		final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		SoapObject soapObject = new SoapObject(SERVICE_NS,methodName);
		envelope.bodyOut = soapObject;//
		envelope.dotNet = true;
		//
		FutureTask<List<String>>  task = new FutureTask<List<String>>(
				new Callable<List<String>>(){
					@Override
					public List<String> call() throws Exception{
						//key:  call relevant method:  SERVICE_NS + methodName
						//the call result is in the envelope
						ht.call(SERVICE_NS + methodName, envelope);
						if(envelope.getResponse()!=null){
							SoapObject result = (SoapObject)envelope.bodyIn;//
							/*
    						<getRegionProvinceResponse xmlns="http://WebXml.com.cn/">
      							<getRegionProvinceResult>
 								<string>string</string>
        						<string>string</string>
      						</getRegionProvinceResult>
    						*/
							SoapObject detail = (SoapObject) result.getProperty(methodName + "Result");
							return parseProvinceorCity(detail); 
						}
						return null;
					}
				}
				);
		
		new Thread(task).start();
		try{
			return task.get();//
		}catch(Exception e){
			e.printStackTrace();
			
		}
		
		return null;
	}
	//
	public static List<String> getCityListByProvince(String province){
		//Request:
		/* <getSupportCityString xmlns="http://WebXml.com.cn/">
      <theRegionCode>string</theRegionCode>
    </getSupportCityString>*/
		//Response:
		/*
		 *  <getSupportCityStringResponse xmlns="http://WebXml.com.cn/">
      <getSupportCityStringResult>
        <string>string</string>
        <string>string</string>
      </getSupportCityStringResult>
    </getSupportCityStringResponse>*/
		
		//输入参数:theRegionCode = 省市、国家ID或名称,返回数据:一维字符串数组。
		//返回数据:一维字符串数组 String()。结构:用---英文逗号分割的城市或地区名称和对应ID---。
		//eg:Array(0) = "无城市,000000"
		final String methodName = "getSupportCityString";
		final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		SoapObject soapObject = new SoapObject(SERVICE_NS,methodName);
		soapObject.addProperty("theRegionCode", province);//<--输入参数:theRegionCode
		envelope.bodyOut = soapObject;
		envelope.dotNet = true;
		
		//define the thread to get city List of  the given province
		FutureTask<List<String>> task = new FutureTask<List<String>> (
				new Callable<List<String>>(){
					@Override
					public List<String> call() throws Exception{
						ht.call(SERVICE_NS + methodName, envelope);
						if(envelope.getResponse() != null){
							SoapObject result = (SoapObject)envelope.bodyIn;
							SoapObject detail = (SoapObject) result.getProperty("getSupportCityStringResult");
							return parseProvinceorCity(detail);
							}
						return null;
					}
				});
		
		//run the thread
		new Thread(task).start();
		try{
			return task.get();
		}catch(Exception e){
			e.printStackTrace();
		}
	
	
	return null;
	}
	
	//
	private static 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;
	} 
	
	
	//result type:  SoapObject
	public static SoapObject getWeatherByCity(String cityName){
		/*
		 *   <getWeather xmlns="http://WebXml.com.cn/">
      		<theCityCode>string</theCityCode>  <---  addProperty 
      		<theUserID>string</theUserID>
      
      		 <getWeatherResponse xmlns="http://WebXml.com.cn/">
      		<getWeatherResult>
        		<string>string</string>
        	<string>string</string>
      		</getWeatherResult>
    		</getWeatherResponse>
		 * */
		final String methodName = "getWeather";
		final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
		//ht.debug = true;//
		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
		SoapObject soapObject = new SoapObject(SERVICE_NS,methodName);
		soapObject.addProperty("theCityCode", cityName);//<--输入参数:theRegionCode  type:String
		envelope.bodyOut = soapObject;
		envelope.dotNet = true;
		
		
		FutureTask<SoapObject> task = new FutureTask<SoapObject> (
				new Callable<SoapObject>(){
					@Override
					public SoapObject call() throws Exception{
						ht.call(SERVICE_NS + methodName, envelope);
						if(envelope.getResponse() != null){
							SoapObject result = (SoapObject)envelope.bodyIn;
							SoapObject detail = (SoapObject) result.getProperty(methodName + "Result");
							return detail;//
							}
						return null;
					}
				});
		
		//run the thread
		new Thread(task).start();
		try{
			return task.get();
		}catch(Exception e){
			e.printStackTrace();
		}
	
	
	return null;
	
	}
	
}

ListAdapter.java

package com.example.myweather;

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter
{
	private Context context;
	private List<String> values;

	public ListAdapter(Context context , List<String> values)
	{
		this.context = context;
		this.values = values;// get the data of values from main programme
	}

	@Override
	public int getCount()
	{
		return values.size();
	}

	@Override
	public Object getItem(int position)
	{
		return values.get(position);
	}

	@Override
	public long getItemId(int position)
	{
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent)
	{
		TextView text = new TextView(context);
		text.setText(values.get(position));//*************
		text.setTextSize(20);
		text.setTextColor(Color.BLUE);//set text color
		return text;
	}
}

MyWeather.java

package com.example.myweather;

import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter
{
	private Context context;
	private List<String> values;

	public ListAdapter(Context context , List<String> values)
	{
		this.context = context;
		this.values = values;// get the data of values from main programme
	}

	@Override
	public int getCount()
	{
		return values.size();
	}

	@Override
	public Object getItem(int position)
	{
		return values.get(position);
	}

	@Override
	public long getItemId(int position)
	{
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent)
	{
		TextView text = new TextView(context);
		text.setText(values.get(position));//*************
		text.setTextSize(20);
		text.setTextColor(Color.BLUE);//set text color
		return text;
	}
}

注释:

1.

http://www.webxml.com.cn/zh_cn/weather_icon.aspx

天气预报WEB服务接口说明- 天气现象和图例

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

    private int 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;

              …..

}

2.

WeatherService接口帮助文档

http://www.webxml.com.cn/files/WeatherWsHelp.pdf

 

eg:

getRegionProvince方法

获得中国省份、直辖市、地区和与之对应的ID

输入参数:无,返回数据:一维字符串数组 String()

结构:用英文逗号分割的省份(直辖市、地区)和对应ID。示例:

'VB

Array(0)= "上海,31112"

……

……

Array(n)= "城市/地区,ID"

 

3.

provinceSpinner.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener() {}

首先应用启动的时候,就会自动调用一次OnItemSelectedListener中的事件


4.

测试FutureTask的用法,如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask。

FutureTask 仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get方法

相关线程类以及接口:

01.FutureTask

public class FutureTask<V>

extends Object

implements RunnableFuture<V>

构造方法摘要

FutureTask(Callable<V> callable)
          创建一个 FutureTask,一旦运行就执行给定的 Callable

方法摘要

V get() 
如有必要,等待计算完成,然后获取其结果。
boolean isDone() 
如果任务已完成,则返回 true。

02. Callable

java.util.concurrent
接口 Callable<V>

返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做call的方法。

方法摘要
V call() 
计算结果,如果无法计算结果,则抛出一个异常。
方法详细信息
call
V call()
hrows Exception
计算结果,如果无法计算结果,则抛出一个异常。 
返回: 
计算的结果 
抛出: 
Exception - 如果无法计算结果


eg:

public class CallableAndFuture {

         publicstatic void main(String[] args) {

                   Callable<Integer> callable = new Callable<Integer>() {

                            publicInteger call() throws Exception {

                                     returnnew Random().nextInt(100);

                            }

                   };

                   FutureTask<Integer> future = newFutureTask<Integer>(callable);

                   new Thread(future).start();

                   try{

                            Thread.sleep(5000);//可能做一些事情

                            System.out.println(future.get());

                   }catch (InterruptedException e) {

                            e.printStackTrace();

                   }catch (ExecutionException e) {

                            e.printStackTrace();

                   }

         }

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值