WebService使用实例
2015-06-12 16:59
337 查看
最近刚刚开始学习使用WebService的方法进行服务器端数据交互,发现网上的资料不是很全,
目前就结合收集到的一些资料做了一个小例子和大家分享一下~
我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过J***A
ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:
首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包
下载地址 点击进入代码下载
然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build
path->configure build path--选择Libraries,如图:
同时,只添加jar包肯能是不够的,需要添加class folder,即可以再工程的libs文件夹中加入下载的KSOAP包,如图:
环境配好之后可以用下面七个步骤来调用WebService方法:
第一:实例化SoapObject对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:
//命名空间
privatestatic final String serviceNameSpace="http://WebXml.com.cn/";
//调用方法(获得支持的城市)
privatestatic final String getSupportCity="getSupportCity";
//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
第二步:假设方法有参数的话,设置调用方法参数:
request.addProperty("参数名称","参数值");
第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):
//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
第四步:注册Envelope:
(new MarshalBase64()).register(envelope);
第五步:构建传输对象,并指明WSDL文档URL:
//请求URL
privatestatic final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;
第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
第七步:解析返回数据:
if(envelope.getResponse()!=null){
return parse(envelope.bodyIn.toString());
}
这里有个地址提供webService天气预报的服务网站,在浏览器中输入网站:http://www.webxml.com.cn/webservices/weatherwebservice.asmx可以看到该网站提供的
调用方法,点进去之后可以看到调用时需要输入的参数,当然有的不需要参数,例如:getSupportProvince ,而getSupportCity需要输入查找的省份名,getWeatherbyCityName 需要输入查找的城市名。接下来我们就利用这三个接口获得数据,并做出显示:
获得本天气预报Web Service支持的洲,国内外省份和城市信息:
[html] view
plaincopyprint?
public class MainActivity extends Activity {
// WSDL文档中的命名空间
private static final String targetNameSpace = "http://WebXml.com.cn/";
// WSDL文档中的URL
private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
// 需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)
private static final String getSupportProvince = "getSupportProvince";
private List<Map<String,String>> listItems;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems = new ArrayList<Map<String,String>>();
mListView = (ListView) findViewById(R.id.province_list);
new NetAsyncTask().execute();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String mProvinceName = listItems.get(position).get("province");
Log.d("ProvinceName", mProvinceName);
Intent intent = new Intent();
intent.putExtra("Pname", mProvinceName);
intent.setClass(MainActivity.this, CityActivity.class);
startActivity(intent);
}
});
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
if (result.equals("success")) {
//列表适配器
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, listItems, R.layout.province_item,
new String[] {"province"}, new int[]{R.id.province});
mListView.setAdapter(simpleAdapter);
}
super.onPostExecute(result);
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,
getSupportProvince);
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
// 或者envelop.bodyOut = soapObject;
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getSupportProvince, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
int count = resultObj.getPropertyCount();
for (int i = 0; i < count; i++) {
Map<String,String> listItem = new HashMap<String, String>();
listItem.put("province", resultObj.getProperty(i).toString());
listItems.add(listItem);
}
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
显示省份列表的activity_main.xml文件:
[html] view
plaincopyprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/province_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
列表中选项显示的province_item.xml文件:
[html] view
plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/province"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:textSize="20sp"/>
</LinearLayout>
效果图,如图:
查询本天气预报Web Services支持的国内外城市或地区信息:
[java] view
plaincopyprint?
public class CityActivity extends Activity {
// WSDL文档中的命名空间
private static final String targetNameSpace = "http://WebXml.com.cn/";
// WSDL文档中的URL
private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
// 需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数)
private static final String getSupportCity = "getSupportCity";
private List<Map<String,String>> listItems;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems = new ArrayList<Map<String,String>>();
mListView = (ListView) findViewById(R.id.province_list);
new NetAsyncTask().execute();
//列表单击事件监听
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String mCityName = listItems.get(position).get("city");
String cityName = getCityName(mCityName);
Log.d("CityName", cityName);
Intent intent = new Intent();
//存储选择的城市名
intent.putExtra("Cname", cityName);
intent.setClass(CityActivity.this, WeatherActivity.class);
startActivity(intent);
}
});
}
/**
* 拆分“城市 (代码)”字符串,将“城市”字符串分离
* @param name
* @return
*/
public String getCityName(String name) {
String city = "";
int position = name.indexOf(' ');
city = name.substring(0, position);
return city;
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
if (result.equals("success")) {
//列表适配器
SimpleAdapter simpleAdapter = new SimpleAdapter(CityActivity.this, listItems, R.layout.province_item,
new String[] {"city"}, new int[]{R.id.province});
mListView.setAdapter(simpleAdapter);
}
super.onPostExecute(result);
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,getSupportCity);
//参数输入
String name = getIntent().getExtras().getString("Pname");
soapObject.addProperty("byProvinceName", name);
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getSupportCity, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
int count = resultObj.getPropertyCount();
for (int i = 0; i < count; i++) {
Map<String,String> listItem = new HashMap<String, String>();
listItem.put("city", resultObj.getProperty(i).toString());
listItems.add(listItem);
}
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
用于列表显示的xml重复使用,这里就不再重复写一次了,效果图,如图:
最后,根据选择的城市或地区名称获得天气情况:
[java] view
plaincopyprint?
public class WeatherActivity extends Activity {
//WSDL文档中的命名空间
private static final String targetNameSpace="http://WebXml.com.cn/";
//WSDL文档中的URL
private static final String WSDL="http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
private static final String getWeatherbyCityName="getWeatherbyCityName";
WeatherBean mWBean;
private ImageView mImageView;
private EditText mCityName;
private EditText mTemp;
private EditText mWeather;
private TextView mToday;
private TextView mDetail;
private int Image[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weather);
Image = new int[]{R.drawable.image0,R.drawable.image1,R.drawable.image2,
R.drawable.image3,R.drawable.image4,R.drawable.image5,
R.drawable.image6,R.drawable.image7,R.drawable.image8,
R.drawable.image9,R.drawable.image10,R.drawable.image11,
R.drawable.image12,R.drawable.image13,R.drawable.image14,
R.drawable.image15,R.drawable.image16,R.drawable.image17,
R.drawable.image18,R.drawable.image19,R.drawable.image20,
R.drawable.image21,R.drawable.image22,R.drawable.image23,
R.drawable.image24,R.drawable.image25,R.drawable.image26,
R.drawable.image27};
mWBean = new WeatherBean();
mImageView = (ImageView) findViewById(R.id.picture);
mCityName = (EditText) findViewById(R.id.city_name);
mTemp = (EditText) findViewById(R.id.temp);
mWeather = (EditText) findViewById(R.id.weather);
mToday = (TextView) findViewById(R.id.today_weather);
mDetail = (TextView) findViewById(R.id.city_detail);
new NetAsyncTask().execute();
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
String image = mWBean.getWeatherPicture();
int position = getImageId(image);
Log.d("image", Image[position]+"");
mImageView.setImageResource(Image[position]);
mCityName.setText(mWBean.getCityName());
mTemp.setText(mWBean.getTemp());
mWeather.setText(mWBean.getWeather());
mToday.setText(mWBean.getLiveWeather());
mDetail.setText(mWBean.getCityDetail());
super.onPostExecute(result);
}
public int getImageId(String picture) {
int id = 0;
int tempId = picture.indexOf('.');
String sub = picture.substring(0, tempId);
id = Integer.parseInt(sub);
return id;
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,getWeatherbyCityName);
String city = getIntent().getExtras().getString("Cname");
soapObject.addProperty("theCityName",city);//调用的方法参数与参数值(根据具体需要可选可不选)
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
// 或者envelop.bodyOut = soapObject;
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getWeatherbyCityName, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
mWBean.setCityName(resultObj.getProperty(1).toString());
mWBean.setTemp(resultObj.getProperty(5).toString());
mWBean.setWeather(resultObj.getProperty(6).toString());
mWBean.setWeatherPicture(resultObj.getProperty(8).toString());
mWBean.setLiveWeather(resultObj.getProperty(10).toString());
mWBean.setCityDetail(resultObj.getProperty(22).toString());
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
这里没有显示全部的信息,提供了一个存储部分天气信息的类:
[java] view
plaincopyprint?
public class WeatherBean {
private String CityName;
private String Temp;
private String Weather;
private String WeatherPicture;
private String LiveWeather;
private String CityDetail;
public String getCityName() {
return CityName;
}
public void setCityName(String cityName) {
CityName = cityName;
}
public String getLiveWeather() {
return LiveWeather;
}
public void setLiveWeather(String liveWeather) {
LiveWeather = liveWeather;
}
public String getTemp() {
return Temp;
}
public void setTemp(String temp) {
Temp = temp;
}
public String getWeather() {
return Weather;
}
public void setWeather(String weather) {
Weather = weather;
}
public String getWeatherPicture() {
return WeatherPicture;
}
public void setWeatherPicture(String weatherPicture) {
WeatherPicture = weatherPicture;
}
public String getCityDetail() {
return CityDetail;
}
public void setCityDetail(String cityDetail) {
CityDetail = cityDetail;
}
}
显示天气状况的weather.xml文件:
[html] view
plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TableRow>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="天气实况:"
android:textSize="16sp" />
<ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="城市:"
android:textSize="16sp" />
<EditText
android:id="@+id/city_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="城市名称"
android:editable="false" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="温度:"
android:textSize="16sp" />
<EditText
android:id="@+id/temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="今日气温"
android:editable="false" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="天气:"
android:textSize="16sp" />
<EditText
android:id="@+id/weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="今日天气"
android:editable="false" />
</TableRow>
</TableLayout>
<TextView
android:id="@+id/today_weather"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="城市简介:"
android:textSize="16sp" />
<TextView
android:id="@+id/city_detail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp" />
</LinearLayout>
</ScrollView>
效果图如图:
这里许多功能做得不是很完善,大家可以根据自己的需要进行设计~
点击进入代码下载
目前就结合收集到的一些资料做了一个小例子和大家分享一下~
我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过J***A
ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:
首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包
下载地址 点击进入代码下载
然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build
path->configure build path--选择Libraries,如图:
同时,只添加jar包肯能是不够的,需要添加class folder,即可以再工程的libs文件夹中加入下载的KSOAP包,如图:
环境配好之后可以用下面七个步骤来调用WebService方法:
第一:实例化SoapObject对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:
//命名空间
privatestatic final String serviceNameSpace="http://WebXml.com.cn/";
//调用方法(获得支持的城市)
privatestatic final String getSupportCity="getSupportCity";
//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
第二步:假设方法有参数的话,设置调用方法参数:
request.addProperty("参数名称","参数值");
第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):
//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
第四步:注册Envelope:
(new MarshalBase64()).register(envelope);
第五步:构建传输对象,并指明WSDL文档URL:
//请求URL
privatestatic final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;
第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
第七步:解析返回数据:
if(envelope.getResponse()!=null){
return parse(envelope.bodyIn.toString());
}
这里有个地址提供webService天气预报的服务网站,在浏览器中输入网站:http://www.webxml.com.cn/webservices/weatherwebservice.asmx可以看到该网站提供的
调用方法,点进去之后可以看到调用时需要输入的参数,当然有的不需要参数,例如:getSupportProvince ,而getSupportCity需要输入查找的省份名,getWeatherbyCityName 需要输入查找的城市名。接下来我们就利用这三个接口获得数据,并做出显示:
获得本天气预报Web Service支持的洲,国内外省份和城市信息:
[html] view
plaincopyprint?
public class MainActivity extends Activity {
// WSDL文档中的命名空间
private static final String targetNameSpace = "http://WebXml.com.cn/";
// WSDL文档中的URL
private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
// 需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)
private static final String getSupportProvince = "getSupportProvince";
private List<Map<String,String>> listItems;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems = new ArrayList<Map<String,String>>();
mListView = (ListView) findViewById(R.id.province_list);
new NetAsyncTask().execute();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String mProvinceName = listItems.get(position).get("province");
Log.d("ProvinceName", mProvinceName);
Intent intent = new Intent();
intent.putExtra("Pname", mProvinceName);
intent.setClass(MainActivity.this, CityActivity.class);
startActivity(intent);
}
});
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
if (result.equals("success")) {
//列表适配器
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, listItems, R.layout.province_item,
new String[] {"province"}, new int[]{R.id.province});
mListView.setAdapter(simpleAdapter);
}
super.onPostExecute(result);
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,
getSupportProvince);
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
// 或者envelop.bodyOut = soapObject;
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getSupportProvince, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
int count = resultObj.getPropertyCount();
for (int i = 0; i < count; i++) {
Map<String,String> listItem = new HashMap<String, String>();
listItem.put("province", resultObj.getProperty(i).toString());
listItems.add(listItem);
}
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
显示省份列表的activity_main.xml文件:
[html] view
plaincopyprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/province_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
列表中选项显示的province_item.xml文件:
[html] view
plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/province"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:textSize="20sp"/>
</LinearLayout>
效果图,如图:
查询本天气预报Web Services支持的国内外城市或地区信息:
[java] view
plaincopyprint?
public class CityActivity extends Activity {
// WSDL文档中的命名空间
private static final String targetNameSpace = "http://WebXml.com.cn/";
// WSDL文档中的URL
private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
// 需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数)
private static final String getSupportCity = "getSupportCity";
private List<Map<String,String>> listItems;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems = new ArrayList<Map<String,String>>();
mListView = (ListView) findViewById(R.id.province_list);
new NetAsyncTask().execute();
//列表单击事件监听
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String mCityName = listItems.get(position).get("city");
String cityName = getCityName(mCityName);
Log.d("CityName", cityName);
Intent intent = new Intent();
//存储选择的城市名
intent.putExtra("Cname", cityName);
intent.setClass(CityActivity.this, WeatherActivity.class);
startActivity(intent);
}
});
}
/**
* 拆分“城市 (代码)”字符串,将“城市”字符串分离
* @param name
* @return
*/
public String getCityName(String name) {
String city = "";
int position = name.indexOf(' ');
city = name.substring(0, position);
return city;
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
if (result.equals("success")) {
//列表适配器
SimpleAdapter simpleAdapter = new SimpleAdapter(CityActivity.this, listItems, R.layout.province_item,
new String[] {"city"}, new int[]{R.id.province});
mListView.setAdapter(simpleAdapter);
}
super.onPostExecute(result);
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,getSupportCity);
//参数输入
String name = getIntent().getExtras().getString("Pname");
soapObject.addProperty("byProvinceName", name);
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getSupportCity, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
int count = resultObj.getPropertyCount();
for (int i = 0; i < count; i++) {
Map<String,String> listItem = new HashMap<String, String>();
listItem.put("city", resultObj.getProperty(i).toString());
listItems.add(listItem);
}
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
用于列表显示的xml重复使用,这里就不再重复写一次了,效果图,如图:
最后,根据选择的城市或地区名称获得天气情况:
[java] view
plaincopyprint?
public class WeatherActivity extends Activity {
//WSDL文档中的命名空间
private static final String targetNameSpace="http://WebXml.com.cn/";
//WSDL文档中的URL
private static final String WSDL="http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
private static final String getWeatherbyCityName="getWeatherbyCityName";
WeatherBean mWBean;
private ImageView mImageView;
private EditText mCityName;
private EditText mTemp;
private EditText mWeather;
private TextView mToday;
private TextView mDetail;
private int Image[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.weather);
Image = new int[]{R.drawable.image0,R.drawable.image1,R.drawable.image2,
R.drawable.image3,R.drawable.image4,R.drawable.image5,
R.drawable.image6,R.drawable.image7,R.drawable.image8,
R.drawable.image9,R.drawable.image10,R.drawable.image11,
R.drawable.image12,R.drawable.image13,R.drawable.image14,
R.drawable.image15,R.drawable.image16,R.drawable.image17,
R.drawable.image18,R.drawable.image19,R.drawable.image20,
R.drawable.image21,R.drawable.image22,R.drawable.image23,
R.drawable.image24,R.drawable.image25,R.drawable.image26,
R.drawable.image27};
mWBean = new WeatherBean();
mImageView = (ImageView) findViewById(R.id.picture);
mCityName = (EditText) findViewById(R.id.city_name);
mTemp = (EditText) findViewById(R.id.temp);
mWeather = (EditText) findViewById(R.id.weather);
mToday = (TextView) findViewById(R.id.today_weather);
mDetail = (TextView) findViewById(R.id.city_detail);
new NetAsyncTask().execute();
}
class NetAsyncTask extends AsyncTask<Object, Object, String> {
@Override
protected void onPostExecute(String result) {
String image = mWBean.getWeatherPicture();
int position = getImageId(image);
Log.d("image", Image[position]+"");
mImageView.setImageResource(Image[position]);
mCityName.setText(mWBean.getCityName());
mTemp.setText(mWBean.getTemp());
mWeather.setText(mWBean.getWeather());
mToday.setText(mWBean.getLiveWeather());
mDetail.setText(mWBean.getCityDetail());
super.onPostExecute(result);
}
public int getImageId(String picture) {
int id = 0;
int tempId = picture.indexOf('.');
String sub = picture.substring(0, tempId);
id = Integer.parseInt(sub);
return id;
}
@Override
protected String doInBackground(Object... params) {
// 根据命名空间和方法得到SoapObject对象
SoapObject soapObject = new SoapObject(targetNameSpace,getWeatherbyCityName);
String city = getIntent().getExtras().getString("Cname");
soapObject.addProperty("theCityName",city);//调用的方法参数与参数值(根据具体需要可选可不选)
// 通过SOAP1.1协议得到envelop对象
SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// 将soapObject对象设置为envelop对象,传出消息
envelop.dotNet = true;
envelop.setOutputSoapObject(soapObject);
// 或者envelop.bodyOut = soapObject;
HttpTransportSE httpSE = new HttpTransportSE(WSDL);
// 开始调用远程方法
try {
httpSE.call(targetNameSpace + getWeatherbyCityName, envelop);
// 得到远程方法返回的SOAP对象
SoapObject resultObj = (SoapObject) envelop.getResponse();
// 得到服务器传回的数据
mWBean.setCityName(resultObj.getProperty(1).toString());
mWBean.setTemp(resultObj.getProperty(5).toString());
mWBean.setWeather(resultObj.getProperty(6).toString());
mWBean.setWeatherPicture(resultObj.getProperty(8).toString());
mWBean.setLiveWeather(resultObj.getProperty(10).toString());
mWBean.setCityDetail(resultObj.getProperty(22).toString());
} catch (IOException e) {
e.printStackTrace();
return "IOException";
} catch (XmlPullParserException e) {
e.printStackTrace();
return "XmlPullParserException";
}
return "success";
}
}
}
这里没有显示全部的信息,提供了一个存储部分天气信息的类:
[java] view
plaincopyprint?
public class WeatherBean {
private String CityName;
private String Temp;
private String Weather;
private String WeatherPicture;
private String LiveWeather;
private String CityDetail;
public String getCityName() {
return CityName;
}
public void setCityName(String cityName) {
CityName = cityName;
}
public String getLiveWeather() {
return LiveWeather;
}
public void setLiveWeather(String liveWeather) {
LiveWeather = liveWeather;
}
public String getTemp() {
return Temp;
}
public void setTemp(String temp) {
Temp = temp;
}
public String getWeather() {
return Weather;
}
public void setWeather(String weather) {
Weather = weather;
}
public String getWeatherPicture() {
return WeatherPicture;
}
public void setWeatherPicture(String weatherPicture) {
WeatherPicture = weatherPicture;
}
public String getCityDetail() {
return CityDetail;
}
public void setCityDetail(String cityDetail) {
CityDetail = cityDetail;
}
}
显示天气状况的weather.xml文件:
[html] view
plaincopyprint?
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TableRow>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="天气实况:"
android:textSize="16sp" />
<ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="城市:"
android:textSize="16sp" />
<EditText
android:id="@+id/city_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="城市名称"
android:editable="false" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="温度:"
android:textSize="16sp" />
<EditText
android:id="@+id/temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="今日气温"
android:editable="false" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="天气:"
android:textSize="16sp" />
<EditText
android:id="@+id/weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="今日天气"
android:editable="false" />
</TableRow>
</TableLayout>
<TextView
android:id="@+id/today_weather"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="城市简介:"
android:textSize="16sp" />
<TextView
android:id="@+id/city_detail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp" />
</LinearLayout>
</ScrollView>
效果图如图:
这里许多功能做得不是很完善,大家可以根据自己的需要进行设计~
点击进入代码下载
相关文章推荐
- 使用Emmet加速Web前端开发
- OC3_字典
- c#base64图片格式
- 分布式助手Zookeeper(二)
- 1035. Password (20)
- Android实用方法—activity多个fragment切换
- SourceInsight注册码
- 1035. Password (20)
- javascript 编程题目
- OC班级类
- Contiki入门学习
- 庆祝入驻博客园
- 重构的技巧
- Ubuntu 杂音 alsa*
- ios 类别和扩展-赵小波
- SSH注解的配置
- angular js 避免UI闪烁
- haproxy+keepalived实现高可用负载均衡
- Android:控件WebView显示网页
- libusb开发者指南(转)