Android 使用 ksoap2-android调用Web Service学习

今天学习《疯狂Android讲义》,看到web service的使用这章时,准备点时间,做个学习笔记,做一个天气预报的apk出来,顺便也巩固下sharedpreference 的用法


该文章中使用到 ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar 在可以在网站 http://code.google.com/p/ksoap2-android/  下载

web service服务器地址 : http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx 



使用 ksoap2-android调用web service的步骤:

1、创建HttpTransportSE对象,该对象用于调用Webservice操作。
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); 
其中:SERVICE_URL是webservice提供服务的url 本例中为:public static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";


2、使用SOAP1.1协议创建SoapSerializationEnvelope对象。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
作用:使用SoapSerializationEnvelope对象的bodyOut属性传给服务器, 服务器响应生成的SOAP消息也通过SoapSerializationEnvelope对象的bodyin属性来获取


3、创建SoapObject对象,创建该对象时需要传入所要调用Web Service的命名空间。
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
说明:
第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。本例中:public static final String SERVICE_NS = "http://WebXml.com.cn/";
第二个参数表示要调用的WebService方法名。 


4、调用方法 如果有参数需要传给Web Servcie服务端,则调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值。
//final String methodName = "getSupportCityString";
soapObject.addProperty("theRegionCode", province);


5、调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为SoapSerializationEnvelpe的传出SOAP消息体。
envelope.bodyOut = soapObject;


6、调用对象的call()方法,并以SoapSerializationEnvelpe作为参数调用远程Web Servcie。
ht.call(SERVICE_NS + methodName, envelope);


7、调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObjectd对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值。     
if(envelope.getResponse() != null){
//获取服务器响应返回的SOAP消息
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");
//解析soap消息
return parseProvinceOrCity(detail);
}


附主要代码:WebServiceUtil.java

/**
 * 文件名:WebServiceUtil.java
 * author: jimbo
 * 版本信息 : magniwill copyright 2014
 * 日期:2014-4-11
 *  数据服务器地址   参考 : http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
 */
package cn.magniwill.weatherforecast.utils;


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

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

import android.database.CursorJoiner.Result;
import android.provider.ContactsContract.CommonDataKinds.Event;

/**
 * @author Administrator
 *
 */
public class WebServiceUtil {
	
	// web services namespace
	public static final String SERVICE_NS = "http://WebXml.com.cn/";
	
	//web services 提供服务的url
	public static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
	

	// 调用web services 取得省份列表
	public static List<String> getProvinceList(){
		List<String> province = new ArrayList<String>();
		
		//web service method
		final String methodName = "getRegionProvince";
		
		//httptra
		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 {
				//call web services
				ht.call(SERVICE_NS + methodName, envelope);
				if(envelope.getResponse() != null){
					//获取服务器响应返回的SOAP消息
					SoapObject result = (SoapObject) envelope.bodyIn;
					SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");
					//解析soap消息
					return parseProvinceOrCity(detail);
				}
				// TODO Auto-generated method stub
				return null;
			}
		});
		
		new Thread(task).start();
		try {
			return task.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	public static List<String> getCityListByProvince(String province){
		//method name 
		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 {
				//call web services
				ht.call(SERVICE_NS + methodName, envelope);
				if(envelope.getResponse() != null){
					//获取服务器响应返回的SOAP消息
					SoapObject result = (SoapObject) envelope.bodyIn;
					SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");
					//解析soap消息
					return parseProvinceOrCity(detail);
				}
				// TODO Auto-generated method stub
				return null;
			}
		});
		
		new Thread(task).start();
		try {
			return task.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return null;		
	}
	
	public static SoapObject getWeatherByCity(String cityName){
		final String methodName = "getWeather";
		final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
		ht.debug = true;
		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.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);
				if(envelope.getResponse() != null){
					
					SoapObject result = (SoapObject) envelope.bodyIn;
					SoapObject detail = (SoapObject) result.getProperty(methodName+ "Result");
					
					// TODO Auto-generated method stub
					return detail;
				}
				return null;
			}
		});
		
		new Thread(task).start();
		try {
			return task.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * @param detail
	 * @return
	 */
	private static List<String> parseProvinceOrCity(SoapObject detail) {
		List<String> result = new ArrayList<String>();
		for(int i=0; i<detail.getPropertyCount(); i++){
			// parse data
			result.add(detail.getProperty(i).toString().split(",")[0]);
		}
		
		// TODO Auto-generated method stub
		return result;
	}
}

MainActivity.java

package cn.magniwill.weatherforecast;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.ksoap2.serialization.SoapObject;

import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.preference.Preference;
import android.provider.SyncStateContract.Constants;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import cn.magniwill.weatherforecast.utils.WebServiceUtil;

public class MainActivity extends Activity {

	private Spinner mProvinceSpinner = null;
	private Spinner mCitySpinner = null;
	
	//today controls
	private ImageView mTodayIV1 = null;
	private ImageView mTodayIV2 = null;
	private TextView mTodayTV = null;
	// tomorrow controls
	private ImageView mTomorrowIV1 = null;
	private ImageView mTomorrowIV2 = null;
	private TextView mTomorrowTV = null;
	// afterday controls
	private ImageView mAfterdayIV1 = null;
	private ImageView mAfterdayIV2 = null;
	private TextView mAfterdayTV = null;
	// the fourth day controls
	private ImageView mFourthIV1 = null;
	private ImageView mFourthIV2 = null;
	private TextView mFourthTV = null;
	// the fifth day controls
	private ImageView mFifthIV1 = null;
	private ImageView mFifthIV2 = null;
	private TextView mFifthTV = null;
	
	
	private static final String DEFAULT_PROVINCE = "上海";
	
	private static final String LASTSEL_PROVINCE = "last_secleted_province";
	private static final String LASTSEL_CITY = "last_secleted_city_";
	
	private static final String LASTSEL_FIRST_DAY_ICONS = "first_day_icons";
	private static final String LASTSEL_FIRST_DAY_WEATHER = "first_day_weather";
	private static final String LASTSEL_SECOND_DAY_ICONS = "second_day_icons";
	private static final String LASTSEL_SECOND_DAY_WEATHER = "second_day_weather";
	private static final String LASTSEL_THIRD_DAY_ICONS = "third_day_icons";
	private static final String LASTSEL_THIRD_DAY_WEATHER = "third_day_weather";
	private static final String LASTSEL_FOURTH_DAY_ICONS = "fourth_day_icons";
	private static final String LASTSEL_FOURTH_DAY_WEATHER = "fourth_day_weather";
	private static final String LASTSEL_FIFTH_DAY_ICONS = "fifth_day_icons";
	private static final String LASTSEL_FIFTH_DAY_WEATHER = "fifth_dday_weather";
	
	
	
	private static final String LASTSEL_SECOND_DAY = "last_secleted_city_";
	private static final String LASTSEL_THIERD_DAY = "last_secleted_city_";
	
	private static final String weather_setting = "settings";
	private static final String PROVINCE_KEY = "all_provinces";
	private SharedPreferences mPreference = null;
	
	//保存当前选择的省份名称
	private String mSelProvince = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// int controls
		initControls();
		
		// 判断是否能连上网络
		if(!canConnectInternet()){
			Toast.makeText(this, "Warring: Can't connect to internet!", Toast.LENGTH_SHORT).show();
		//	finish();
		}
		
		List<String> provinces =  new ArrayList<String>();
		
		String savedProvinces = mPreference.getString(PROVINCE_KEY, null);
		if(savedProvinces != null){
		//读取保存省份列表
			String[] provinceArray = savedProvinces.trim().split(",");
			for(String str: provinceArray){
				provinces.add(str);
			}
			
			log("saved provinces is:"+provinces.toString() + "\nlength =" + provinceArray.length);
		}else{
		//第一次打开改程序,没有省份数据时  从服务器读取并保存
			
			provinces = WebServiceUtil.getProvinceList();
			if(provinces == null){
				log("WebServiceUtil.getProvinceList  == null");
				Toast.makeText(this, "未取得城市列表!", Toast.LENGTH_LONG).show();
				finish();
				return;
			}
			
			//保存省份数据
			StringBuilder provincesSB = new StringBuilder();
			for(int i=0; i<provinces.size(); i++){
				provincesSB.append(provinces.get(i));
				if(i != provinces.size()-1) {
					provincesSB.append(",");
				}
			}
			Editor editor = mPreference.edit();
			editor.putString(PROVINCE_KEY, provincesSB.toString());
			editor.commit();
			
			log("get provinces from internet :"+provinces.toString());
		}
		
		SpinnerAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, provinces);
//		SpinnerAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, provinces);
		mProvinceSpinner.setAdapter(adapter);
		
		int selPos = 0;
		String last_selected = mPreference.getString(LASTSEL_PROVINCE, DEFAULT_PROVINCE);
		for(String province: provinces){
			if(last_selected.equals(province)) break;
			
			selPos++;
		}
		mProvinceSpinner.setSelection(selPos);
		//province spinner
		mProvinceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> source, View parent, int position, long id) {
				// TODO Auto-generated method stub
				mSelProvince = mProvinceSpinner.getSelectedItem().toString();
				log("select province :"+mSelProvince);
				
				List<String> cities = new ArrayList<String>();
				
				String savedCitys = mPreference.getString(mSelProvince, null);
				if(savedCitys != null){
				//读取保存的所选省份的城市列表
					String[] citiesArray = savedCitys.trim().split(",");
					for(String str: citiesArray){
						cities.add(str);
					}
					
					log("saved cities is:"+cities.toString() + "\nlength =" + citiesArray.length);
				}else{
					//第一次选择该省,没有城市数据时  从服务器读取并保存
					
					cities = WebServiceUtil.getCityListByProvince(mSelProvince);
					log("get cites from internet::"+cities.toString());
					
				}
				
				//保存城市列表数据
				StringBuilder citiesSB = new StringBuilder();
				for(int i=0; i<cities.size(); i++){
					citiesSB.append(cities.get(i));
					if(i != cities.size()-1) {
						citiesSB.append(",");
					}
				}
				
				// save LASTSEL_PROVINCE
				Editor editor = mPreference.edit();
				editor.putString(LASTSEL_PROVINCE, mSelProvince);
				
				//吧奥村城市列表
				editor.putString(mSelProvince, citiesSB.toString());
				editor.commit();
				
				// 显示 城市 spinner
				if(cities == null){
					log("WebServiceUtil.getCityListByProvince("+mSelProvince+")"+ " == null");
					Toast.makeText(MainActivity.this, "未取得城市列表!", Toast.LENGTH_LONG).show();
				}else{
					SpinnerAdapter cityAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, cities);
					mCitySpinner.setAdapter(cityAdapter);
					
					
					//设置默认选择的城市为上次选择的 默认为:  第一个
					int selPos = 0;
					String last_selected_city = mPreference.getString(LASTSEL_CITY+mSelProvince, " ");
					for(String city: cities){
						if(last_selected_city.equals(city)) break;
						
						selPos++;
					}
					log("last_selected_city is:"+last_selected_city + " selPos="+selPos +" cities.size="+ cities.size());
					// 没有找到所选城市,默认为第一个
					selPos = selPos > cities.size() - 1 ? 0 : selPos;
					mCitySpinner.setSelection(selPos, true);
				}
				
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		});		
		
		//city spinner
		mCitySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
				String selCity = mCitySpinner.getSelectedItem().toString();
				log("selected city :"+selCity);
				
				//get city wather
				showWeather(selCity);    //!!!!!!!!!!!!  main fun
				
				//保存最后选择的城市
				Editor editor = mPreference.edit();
				editor.putString(LASTSEL_CITY + mSelProvince, selCity);
				editor.commit();
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		
	}
	

	private boolean canConnectInternet() {
		boolean ret = false;
		
//		final int WIFI = 1 ,CMWAP=2, CMNET = 3;
		
		ConnectivityManager conn = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = conn.getActiveNetworkInfo();
		if(info != null){
			log(info.toString() + "----------- internet type:"+info.getType());
			
			ret = (info.getState() == NetworkInfo.State.CONNECTED);
			
//			switch(info.getType()){
//			case ConnectivityManager.TYPE_WIFI:
//			case ConnectivityManager.TYPE_MOBILE:
//				ret = true;
//				break;
//				
//			default:
//				break;
//			}
			
		}
		
		log("canConnectInternet = "+ ret);
		// TODO Auto-generated method stub
		return ret;
	}



	/**
	 * @param selCity
	 * 
	 * <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
		<string>直辖市 上海</string>
		<string>闵行</string>
		<string>2008</string>
		<string>2014/04/12 16:44:23</string>
		<string>今日天气实况:气温:18℃;风向/风力:西风 2级;湿度:90%</string>
		<string>空气质量:暂无;紫外线强度:最弱</string>
		<string>
		穿衣指数:较冷,建议着厚外套加毛衣等服装。 过敏指数:极易发,尽量减少外出,外出必须采取防护措施。 运动指数:较不宜,有较强降水,请在室内进行休闲运动。 洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。 晾晒指数:不宜,有较强降水会淋湿衣物,不适宜晾晒。 旅游指数:暂无。 路况指数:湿滑,路面湿滑,车辆易打滑,减慢车速。 舒适度指数:舒适,白天不冷不热,风力不大。 空气污染指数:暂无。 紫外线指数:最弱,辐射弱,涂擦SPF8-12防晒护肤品。
		</string>
		<string>4月12日 中雨转小雨</string>	//7
		<string>13℃/17℃</string>
		<string>东南风4-5级转北风4-5级</string>
		<string>8.gif</string>		
		<string>7.gif</string>
		<string>4月13日 小雨转多云</string>	//12
		<string>12℃/19℃</string>
		<string>北风4-5级转3-4级</string>
		<string>7.gif</string>
		<string>1.gif</string>
		<string>4月14日 晴转多云</string>	//17
		<string>11℃/21℃</string>
		<string>东北风3-4级转东南风3-4级</string>
		<string>0.gif</string>
		<string>1.gif</string>
		<string>4月15日 多云转小雨</string>	//22
		<string>13℃/22℃</string>
		<string>东南风3-4级</string>
		<string>1.gif</string>
		<string>7.gif</string>
		<string>4月16日 阴转小雨</string>	//27
		<string>14℃/20℃</string>
		<string>东南风4-5级</string>
		<string>2.gif</string>
		<string>7.gif</string>
		</ArrayOfString>
	 * 
	 */
	private final int WEATHER_ALLOC_MAX = 256;
	private void showWeather(String city) {
		//显示上次成功登陆保存的天气
		showLastWeather();
		
		
		// 获取远程web service返回的对象
		SoapObject detail = WebServiceUtil.getWeatherByCity(city);
		//获取天气实况
		if(detail == null){
			log("failed to getWeatherByCity("+city+")");
			return;
		}
		
		log("show weather of detial: "+detail);
		// 免费用户范文数量受限
		if(detail.toString().contains("发现错误")){
			//anyType{string=发现错误:免费用户24小时内访问超过规定数量。http://www.webxml.com.cn/; }
			//截取字串 : 免费用户24小时内访问超过规定数量。
			Toast.makeText(this, detail.toString().substring(20, 38), Toast.LENGTH_LONG).show();
			
			return;
		}
		log("show weather of "+detail.getProperty(0)+detail.getProperty(1)+detail.getProperty(2));
		
//		String weatherCurrrent = detail.getProperty(4).toString(); //getProperty(4) : 德奥 <string>今日天气实况:气温。。。
		String weatherCurrrent = detail.getProperty(6).toString(); //getProperty(6) : 穿衣指数:较冷,。。。
		TextView weather = (TextView) findViewById(R.id.weather);
		weather.setText(getResources().getText(R.string.weather_advices)+weatherCurrrent);
		
		
		// weather memory
		byte[] weatheBytes = new byte[WEATHER_ALLOC_MAX];
		
		Editor editor = mPreference.edit();
				
		// 解析今天的天气
		int todayIdex = 7;
		String []icons = new String[2];
		parseWeatherinfo(detail, todayIdex, weatheBytes, icons);
		String todayWeather = new String(weatheBytes);
		
		log("today:"+todayWeather+ "iconToday:"+icons[0]+" "+icons[1]);
				
		//显示天气图片
		showWeatherIcons(mTodayIV1, mTodayIV2, icons);
		
		//text View
		mTodayTV.setText(todayWeather);
		
		//save firstday
		editor.putString(LASTSEL_FIRST_DAY_ICONS, new StringBuilder().append(icons[0]).append(",").append(icons[1]).toString());
		editor.putString(LASTSEL_FIRST_DAY_WEATHER, todayWeather);
		
		
		//解析明天的天气情况
		int tomorrowIdex = 12;
		parseWeatherinfo(detail, tomorrowIdex, weatheBytes, icons);
		String tomorrowWeather = new String(weatheBytes);
		
		log("tomorrow:"+tomorrowWeather+ "iconTomorrow:"+icons[0]+" "+icons[1]);
		
		//显示天气图片
		showWeatherIcons(mTomorrowIV1, mTomorrowIV2, icons);
		
		//text View
		mTomorrowTV.setText(tomorrowWeather);
		
		//save second
		editor.putString(LASTSEL_SECOND_DAY_ICONS, new StringBuilder().append(icons[0]).append(",").append(icons[1]).toString());
		editor.putString(LASTSEL_SECOND_DAY_WEATHER, tomorrowWeather);

		
		//解析后天的天气情况
		int afterdayIdex = 17;
		parseWeatherinfo(detail, afterdayIdex, weatheBytes, icons);
		String afterdayWeather = new String(weatheBytes);
		
		log("afterday:"+afterdayWeather+ "iconTomorrow:"+icons[0]+" "+icons[1]);
		
		//显示天气图片
		showWeatherIcons(mAfterdayIV1, mAfterdayIV2, icons);
		
		//text View
		mAfterdayTV.setText(afterdayWeather);
	
		//save 
		editor.putString(LASTSEL_THIRD_DAY_ICONS, new StringBuilder().append(icons[0]).append(",").append(icons[1]).toString());
		editor.putString(LASTSEL_THIRD_DAY_WEATHER, afterdayWeather);

		
		
		//the fourth day weather
		int fourthIdex = 22;
		parseWeatherinfo(detail, fourthIdex, weatheBytes, icons);
		String fourthWeather = new String(weatheBytes);
		
		log("afterday:"+fourthIdex+ "iconTomorrow:"+icons[0]+" "+icons[1]);
		
		//显示天气图片
		showWeatherIcons(mFourthIV1, mFourthIV2, icons);
		
		//text View
		mFourthTV.setText(fourthWeather);
		
		//save 
		editor.putString(LASTSEL_FOURTH_DAY_ICONS, new StringBuilder().append(icons[0]).append(",").append(icons[1]).toString());
		editor.putString(LASTSEL_FOURTH_DAY_WEATHER, fourthWeather);
		//
		
		
		//the fourth day weather
		int fifthIdex = 27;
		parseWeatherinfo(detail, fifthIdex, weatheBytes, icons);
		String fifthWeather = new String(weatheBytes);
		
		log("afterday:"+fourthIdex+ "iconTomorrow:"+icons[0]+" "+icons[1]);
		
		//显示天气图片
		showWeatherIcons(mFifthIV1, mFifthIV2, icons);
		
		//text View
		mFifthTV.setText(fifthWeather);
		
		//save 
		editor.putString(LASTSEL_FIFTH_DAY_ICONS, new StringBuilder().append(icons[0]).append(",").append(icons[1]).toString());
		editor.putString(LASTSEL_FIFTH_DAY_WEATHER, fifthWeather);
		
		editor.commit();

		//
	}


	private void showLastWeather() {
		// TODO Auto-generated method stub
		log("showLastWeather");
		
		//显示天气图片
		String []icons = new String[2];
		String weather;
		
		String iconStr = mPreference.getString(LASTSEL_FIFTH_DAY_ICONS, "");
		//image Views
		if(!"".equals(iconStr)){
			icons = iconStr.split(",");
			showWeatherIcons(mTodayIV1, mTodayIV2, icons);		
		}
		//text View
		mTodayTV.setText(mPreference.getString(LASTSEL_FIRST_DAY_WEATHER, getResources().getString(R.string.weather_def)));
		
		///--------------------------///
		iconStr = mPreference.getString(LASTSEL_SECOND_DAY_ICONS, "");
		//image Views
		if(!"".equals(iconStr)){
			icons = iconStr.split(",");
			showWeatherIcons(mTomorrowIV1, mTomorrowIV2, icons);		
		}
		//text View
		mTomorrowTV.setText(mPreference.getString(LASTSEL_SECOND_DAY_WEATHER, getResources().getString(R.string.weather_def)));
		
		///--------------------------///
		iconStr = mPreference.getString(LASTSEL_THIRD_DAY_ICONS, "");
		if(!"".equals(iconStr)){
			icons = iconStr.split(",");
			//image Views
			showWeatherIcons(mAfterdayIV1, mFifthIV2, icons);		
		}
		//text View
		mAfterdayTV.setText(mPreference.getString(LASTSEL_THIRD_DAY_WEATHER, getResources().getString(R.string.weather_def)));
		
		///--------------------------///
		iconStr = mPreference.getString(LASTSEL_FOURTH_DAY_ICONS, "");
		if(!"".equals(iconStr)){
			icons = iconStr.split(",");
			//image Views
			showWeatherIcons(mFourthIV1, mFourthIV2, icons);		
		}
		//text View
		mFourthTV.setText(mPreference.getString(LASTSEL_FOURTH_DAY_WEATHER, getResources().getString(R.string.weather_def)));
		
		///--------------------------///
		iconStr = mPreference.getString(LASTSEL_FIFTH_DAY_ICONS, "");
		if(!"".equals(iconStr)){
			icons = iconStr.split(",");
			//image Views
			showWeatherIcons(mFifthIV1, mFifthIV2, icons);		
		}
		//text View
		mFifthTV.setText(mPreference.getString(LASTSEL_FIFTH_DAY_WEATHER, getResources().getString(R.string.weather_def)));
	}


	private void showWeatherIcons(ImageView imageView1, ImageView imageView2, String[] icons) {
		Resources res = getResources();
		
		// image1
		String resStr = "weather_"+icons[0];
		int resID = res.getIdentifier(resStr, "drawable", getPackageName());
		log("showWeatherIcons :  -- image1 to show: "+resStr + " id="+resID);
		
		imageView1.setImageResource(resID);
		
		//image2
		resStr = "weather_"+icons[1];
		resID = res.getIdentifier(resStr, "drawable", getPackageName());
		log("showWeatherIcons :  -- image2 to show: "+resStr + " id="+resID);

		imageView2.setImageResource(resID);		
	}


	private void parseWeatherinfo(SoapObject detail, int todayIdex, byte[] outWeather, String[] outIcons) {
		//resource
		Resources resources = getResources();
		
		//解析今天的天气情况
		StringBuilder weather = new StringBuilder();
		String date = detail.getProperty(todayIdex).toString();
		
		weather.append(resources.getString(R.string.date));
		weather.append(date.split(" ")[0]);  //得到  4月12日 
		weather.append("\n");  //换行
		weather.append(resources.getString(R.string.weathe));  
		weather.append(date.split(" ")[1]);  //得到 中雨转小雨
		weather.append("\n");  //换行
		weather.append(resources.getString(R.string.temperature));  
		weather.append(detail.getProperty(todayIdex+1));  //得到 13℃/17℃
		weather.append("\n");  //换行
		weather.append(resources.getString(R.string.wind));  
		weather.append(detail.getProperty(todayIdex+2));  //得到 东南风4-5级转北风4-5级
		log("parseWeatherinfo: "+ weather);
		
		String icons[] = new String[2];
		String imageStr1 = detail.getProperty(todayIdex+3).toString();
		icons[0] = imageStr1.substring(0, imageStr1.lastIndexOf("."));
		icons[1] = detail.getProperty(todayIdex+4).toString().substring(0, detail.getProperty(11).toString().lastIndexOf("."));
		log("parseWeatherinfo: "+icons[0] + "  "+ icons[1]);
		
		
		//return
		int length = weather.toString().getBytes().length < WEATHER_ALLOC_MAX ? weather.toString().getBytes().length : WEATHER_ALLOC_MAX;
		System.arraycopy(weather.toString().getBytes(), 0, outWeather, 0, length);
		System.arraycopy(icons, 0, outIcons, 0, icons.length);
	}


	private static final String TAG = "WeatherForecast";
	private boolean DEBUG = true;
	/**
	 * @param string
	 */
	private void log(String string) {
		// TODO Auto-generated method stub
		if(DEBUG){
			Log.d(TAG, "--- " + string + " ---");
		}
	}


	/**
	 * 
	 */
	private void initControls() {
		// TODO Auto-generated method stub
		
		mProvinceSpinner = (Spinner) findViewById(R.id.province_spin);
		mCitySpinner = (Spinner) findViewById(R.id.city_spin);
		
		//today controls
		mTodayIV1 = (ImageView) findViewById(R.id.today_iv1);
		mTodayIV2 = (ImageView) findViewById(R.id.today_iv2);
		mTodayTV = (TextView) findViewById(R.id.today_tv);
		//tomorrow controls
		mTomorrowIV1 = (ImageView) findViewById(R.id.tomorrow_iv1);
		mTomorrowIV2 = (ImageView) findViewById(R.id.tomorrow_iv2);
		mTomorrowTV = (TextView) findViewById(R.id.tomorrow_tv);
		//afterday controls
		mAfterdayIV1 = (ImageView) findViewById(R.id.afterday_iv1);
		mAfterdayIV2 = (ImageView) findViewById(R.id.afterday_iv2);
		mAfterdayTV = (TextView) findViewById(R.id.afterday_tv);
		//the fourth controls
		mFourthIV1 = (ImageView) findViewById(R.id.fourth_iv1);
		mFourthIV2 = (ImageView) findViewById(R.id.fourth_iv2);
		mFourthTV = (TextView) findViewById(R.id.fourth_tv);
		//the fifth controls
		mFifthIV1 = (ImageView) findViewById(R.id.fifth_iv1);
		mFifthIV2 = (ImageView) findViewById(R.id.fifth_iv2);
		mFifthTV = (TextView) findViewById(R.id.fifth_tv);
		
		//get she
		mPreference = getSharedPreferences(weather_setting, Context.MODE_PRIVATE);
	}


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}



附图:(默认界面,没有连接网络时的截图)




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值