android 解析webservice List<Object> 填充下拉列表
2011-11-29 10:44
585 查看
依照此方式 可以实现任何的Object填充Spinner 以及调用任何免费webservice。
资源文件如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#000000</color>
<color name="write">#00FFFFFF</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WeatherApp</string>
<string name="province_list_title">请选择省份</string>
<string name="city_list_title">请选择城市</string>
<string name="finding">搜索中</string>
<string name="finding_province">正在搜索地区...</string>
<string name="finding_city">正在搜索城市...</string>
</resources>
<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:paddingTop="2.0dip"
android:paddingBottom="3.0dip"
android:layout_width="fill_parent"
android:layout_height="53px"
android:textSize="24px"
android:paddingLeft="25px"
android:paddingRight="50px"
android:singleLine="true"
android:gravity="center_vertical"
android:ellipsize="marquee"
android:textColor="@color/black"
android:background="@color/write" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/splash_bg">
<Spinner android:id="@+id/province_list"
android:layout_width="215px"
android:layout_height="53px"
android:prompt="@string/province_list_title"
android:background="@drawable/add_province_name"/>
<Spinner android:id="@+id/city_list"
android:layout_width="215px"
android:layout_height="53px"
android:prompt="@string/city_list_title"
android:background="@drawable/add_province_name"/>
</LinearLayout>
ok了 资源文件结束 不解释! 资源中用到的图片 是一个美丽的下拉框 和一个宇宙的背景图
介绍一下实体类吧
package com.fw.entity.weather;
import java.io.Serializable;
import android.os.Parcel;
import android.os.Parcelable;
public class City implements Serializable ,Parcelable {
public City(){}
public City(String cityID , String cityName){
this.cityID = cityID;
this.cityName = cityName;
}
public String getCityID() {
return cityID;
}
public void setCityID(String cityID) {
this.cityID = cityID;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
private String cityID;
private String cityName;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
@Override
public String toString() {
// TODO Auto-generated method stub
return cityName;
}
}
package com.fw.entity.weather;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class Province implements Serializable ,Parcelable {
public Province(){}
public Province(String regionID , String regionName){
this.regionID = regionID;
this.regionName = regionName;
}
public String getRegionID() {
return regionID;
}
public void setRegionID(String regionID) {
this.regionID = regionID;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public ArrayList<City> getCitys() {
if(this.citys == null){
citys = new ArrayList<City>();
}
return citys;
}
public void setCitys(ArrayList<City> citys) {
this.citys = citys;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return regionName;
}
private String regionID;
private String regionName;
private ArrayList<City> citys;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
}
package com.fw.action.weather;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.AttributeInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.util.Log;
import com.fw.entity.weather.City;
import com.fw.entity.weather.Province;
public class WeatherService {
private SoapObject sopObject ;
// 命名空间
private static final String NAMESPACE = "http://WebXml.com.cn/";
//天气预报endPoint
private static final String WEATHERENDPOINT = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
//天气预报soapAction
private static final String WEATHERREGIONACTIVITY = "http://WebXml.com.cn/getRegionDataset";
private static final String WEATHERCITYACTIVITY = "http://WebXml.com.cn/getSupportCityDataset";
// 调用的方法名称
private static final String GETSUPPORTDATA = "getRegionDataset"; //省份 (国家)
private static final String GETSUPPORTCITYDATASET = "getSupportCityDataset"; //省份对应下的城市
private static String GETWEATHER = "getWeather";
public WeatherService(){
//实例化 处理
}
public ArrayList<Province> getProvinceList() {
ArrayList<Province> list = new ArrayList<Province>();
SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTDATA);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);
try {
// 调用WebService
transport.call(WEATHERREGIONACTIVITY, envelope);
} catch (Exception e) {
e.printStackTrace();
}
SoapObject soapObject = (SoapObject) envelope.bodyIn;
soapObject = (SoapObject)soapObject.getProperty(0);
soapObject = (SoapObject)soapObject.getProperty(1);
soapObject = (SoapObject)soapObject.getProperty(0);
int count = soapObject.getPropertyCount();
Province province = null;
for(int i = 0 ; i < count ; i ++ ){
SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);
province = new Province(soapProvince.getProperty("RegionID").toString(),soapProvince.getProperty("RegionName").toString());
list.add(province);
}
return list;
}
public boolean getProvinceCitys(Province province){
SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTCITYDATASET);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
rpc.addProperty("theRegionCode", province.getRegionID());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);
try {
// 调用WebService
transport.call(WEATHERCITYACTIVITY, envelope);
} catch (Exception e) {
e.printStackTrace();
}
SoapObject soapObject = (SoapObject) envelope.bodyIn;
soapObject = (SoapObject)soapObject.getProperty(0);
soapObject = (SoapObject)soapObject.getProperty(1);
soapObject = (SoapObject)soapObject.getProperty(0);
int count = soapObject.getPropertyCount();
City city = null;
for(int i = 0 ; i < count ; i ++ ){
SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);
city = new City(soapProvince.getProperty("CityID").toString(),soapProvince.getProperty("CityName").toString());
province.getCitys().add(city);
}
return false;
}
}
package com.fw.activiy.weather;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import com.fw.action.weather.WeatherService;
import com.fw.entity.weather.City;
import com.fw.entity.weather.Province;
public class WeatherView extends Activity implements Runnable {
public static final int GET_SUPPORT_DATA_TYPE = 0x01;
public static final int GET_CITY_DATA_TYPE = 0x02;
public static final int OPEN_FIND_CITY_DIALOG = 0x03;
public ArrayList<Province> provinces;
public Province curProvince;
public Handler weatherHandler = null;
private Spinner provinceSpinner = null;
private Spinner citySpinner = null;
private ArrayAdapter arrayAdapter ;
private Dialog progressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
provinceSpinner = (Spinner) findViewById(R.id.province_list);
citySpinner = (Spinner) findViewById(R.id.city_list);
setHandlerMessage();
boolean findProvince = false;
try {
FileInputStream inStream = this.openFileInput("provinces.bin");
ObjectInputStream objectInputStream = new ObjectInputStream(inStream);
provinces = (ArrayList<Province>) objectInputStream.readObject();
arrayAdapter = new ArrayAdapter(this,R.layout.text_spinner_item, provinces);
provinceSpinner.setAdapter(arrayAdapter);
Log.e("provinceSpinner", "Adapter OK");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("FileNotFoundException", "provinces not found");
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("StreamCorruptedException", e.toString(), e);
} catch (IOException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("IOException", e.toString(), e);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("ClassNotFoundException", e.toString(), e);
}
if(findProvince){
progressDialog = new ProgressDialog.Builder(this).
setTitle(R.string.finding).
setMessage(R.string.finding_province).
create();
progressDialog.show();
new Thread(this).start();
}
provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(final AdapterView<?> parent, View view,
final int position, long id) {
// TODO Auto-generated method stub
curProvince = (Province) parent.getItemAtPosition(position);
if (curProvince.getCitys().size() < 1){
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", OPEN_FIND_CITY_DIALOG);
weatherHandler.sendMessage(mes);
new Thread(new Runnable() {
@Override
public void run() {
WeatherService weatherService = new WeatherService();
weatherService.getProvinceCitys(curProvince);
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", GET_CITY_DATA_TYPE);
mes.getData().putParcelableArrayList("value",curProvince.getCitys());
weatherHandler.sendMessage(mes);
}
}).start();
}else{
arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, curProvince.getCitys());
citySpinner.setAdapter(arrayAdapter);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
private void setHandlerMessage() {
weatherHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
int type = msg.getData().getInt("type");
switch (type) {
case GET_SUPPORT_DATA_TYPE:
provinces = msg.getData().getParcelableArrayList("value");
arrayAdapter = new ArrayAdapter(WeatherView.this, R.layout.text_spinner_item,provinces);
provinceSpinner.setAdapter(arrayAdapter);
progressDialog.dismiss();
break;
case GET_CITY_DATA_TYPE:
ArrayList<City> cityList = msg.getData().getParcelableArrayList("value");
arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, cityList);
curProvince.setCitys(cityList);
citySpinner.setAdapter(arrayAdapter);
progressDialog.dismiss();
break;
case OPEN_FIND_CITY_DIALOG:
progressDialog = new ProgressDialog.Builder(WeatherView.this).
setTitle(R.string.finding).
setMessage(R.string.finding_city).
create();
progressDialog.show();
}
}
};
}
@Override
public void run() {
// TODO Auto-generated method stub
WeatherService weatherService = new WeatherService();
ArrayList<Province> provinceList = weatherService.getProvinceList();
try {
FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(provinceList);
objectOutputStream.flush();
objectOutputStream.close();
outStream.close();
Log.e("FileOutputStream", "Over");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("FileOutputStream Exception", e.toString(), e);
}
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", GET_SUPPORT_DATA_TYPE);
mes.getData().putParcelableArrayList("value", provinceList);
weatherHandler.sendMessage(mes);
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
// 退出程序的时候把province信息存储在二进制文件中
try {
FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(provinces);
objectOutputStream.flush();
objectOutputStream.close();
outStream.close();
Log.e("FileOutputStream", "Over");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("FileOutputStream Exception", e.toString(), e);
}
super.onBackPressed();
}
}
运行结果如图:
资源文件如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#000000</color>
<color name="write">#00FFFFFF</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">WeatherApp</string>
<string name="province_list_title">请选择省份</string>
<string name="city_list_title">请选择城市</string>
<string name="finding">搜索中</string>
<string name="finding_province">正在搜索地区...</string>
<string name="finding_city">正在搜索城市...</string>
</resources>
<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:paddingTop="2.0dip"
android:paddingBottom="3.0dip"
android:layout_width="fill_parent"
android:layout_height="53px"
android:textSize="24px"
android:paddingLeft="25px"
android:paddingRight="50px"
android:singleLine="true"
android:gravity="center_vertical"
android:ellipsize="marquee"
android:textColor="@color/black"
android:background="@color/write" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/splash_bg">
<Spinner android:id="@+id/province_list"
android:layout_width="215px"
android:layout_height="53px"
android:prompt="@string/province_list_title"
android:background="@drawable/add_province_name"/>
<Spinner android:id="@+id/city_list"
android:layout_width="215px"
android:layout_height="53px"
android:prompt="@string/city_list_title"
android:background="@drawable/add_province_name"/>
</LinearLayout>
ok了 资源文件结束 不解释! 资源中用到的图片 是一个美丽的下拉框 和一个宇宙的背景图
介绍一下实体类吧
package com.fw.entity.weather;
import java.io.Serializable;
import android.os.Parcel;
import android.os.Parcelable;
public class City implements Serializable ,Parcelable {
public City(){}
public City(String cityID , String cityName){
this.cityID = cityID;
this.cityName = cityName;
}
public String getCityID() {
return cityID;
}
public void setCityID(String cityID) {
this.cityID = cityID;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
private String cityID;
private String cityName;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
@Override
public String toString() {
// TODO Auto-generated method stub
return cityName;
}
}
package com.fw.entity.weather;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class Province implements Serializable ,Parcelable {
public Province(){}
public Province(String regionID , String regionName){
this.regionID = regionID;
this.regionName = regionName;
}
public String getRegionID() {
return regionID;
}
public void setRegionID(String regionID) {
this.regionID = regionID;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public ArrayList<City> getCitys() {
if(this.citys == null){
citys = new ArrayList<City>();
}
return citys;
}
public void setCitys(ArrayList<City> citys) {
this.citys = citys;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return regionName;
}
private String regionID;
private String regionName;
private ArrayList<City> citys;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
}
package com.fw.action.weather;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.AttributeInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.util.Log;
import com.fw.entity.weather.City;
import com.fw.entity.weather.Province;
public class WeatherService {
private SoapObject sopObject ;
// 命名空间
private static final String NAMESPACE = "http://WebXml.com.cn/";
//天气预报endPoint
private static final String WEATHERENDPOINT = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
//天气预报soapAction
private static final String WEATHERREGIONACTIVITY = "http://WebXml.com.cn/getRegionDataset";
private static final String WEATHERCITYACTIVITY = "http://WebXml.com.cn/getSupportCityDataset";
// 调用的方法名称
private static final String GETSUPPORTDATA = "getRegionDataset"; //省份 (国家)
private static final String GETSUPPORTCITYDATASET = "getSupportCityDataset"; //省份对应下的城市
private static String GETWEATHER = "getWeather";
public WeatherService(){
//实例化 处理
}
public ArrayList<Province> getProvinceList() {
ArrayList<Province> list = new ArrayList<Province>();
SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTDATA);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);
try {
// 调用WebService
transport.call(WEATHERREGIONACTIVITY, envelope);
} catch (Exception e) {
e.printStackTrace();
}
SoapObject soapObject = (SoapObject) envelope.bodyIn;
soapObject = (SoapObject)soapObject.getProperty(0);
soapObject = (SoapObject)soapObject.getProperty(1);
soapObject = (SoapObject)soapObject.getProperty(0);
int count = soapObject.getPropertyCount();
Province province = null;
for(int i = 0 ; i < count ; i ++ ){
SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);
province = new Province(soapProvince.getProperty("RegionID").toString(),soapProvince.getProperty("RegionName").toString());
list.add(province);
}
return list;
}
public boolean getProvinceCitys(Province province){
SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTCITYDATASET);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
rpc.addProperty("theRegionCode", province.getRegionID());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);
try {
// 调用WebService
transport.call(WEATHERCITYACTIVITY, envelope);
} catch (Exception e) {
e.printStackTrace();
}
SoapObject soapObject = (SoapObject) envelope.bodyIn;
soapObject = (SoapObject)soapObject.getProperty(0);
soapObject = (SoapObject)soapObject.getProperty(1);
soapObject = (SoapObject)soapObject.getProperty(0);
int count = soapObject.getPropertyCount();
City city = null;
for(int i = 0 ; i < count ; i ++ ){
SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);
city = new City(soapProvince.getProperty("CityID").toString(),soapProvince.getProperty("CityName").toString());
province.getCitys().add(city);
}
return false;
}
}
package com.fw.activiy.weather;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;
import com.fw.action.weather.WeatherService;
import com.fw.entity.weather.City;
import com.fw.entity.weather.Province;
public class WeatherView extends Activity implements Runnable {
public static final int GET_SUPPORT_DATA_TYPE = 0x01;
public static final int GET_CITY_DATA_TYPE = 0x02;
public static final int OPEN_FIND_CITY_DIALOG = 0x03;
public ArrayList<Province> provinces;
public Province curProvince;
public Handler weatherHandler = null;
private Spinner provinceSpinner = null;
private Spinner citySpinner = null;
private ArrayAdapter arrayAdapter ;
private Dialog progressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
provinceSpinner = (Spinner) findViewById(R.id.province_list);
citySpinner = (Spinner) findViewById(R.id.city_list);
setHandlerMessage();
boolean findProvince = false;
try {
FileInputStream inStream = this.openFileInput("provinces.bin");
ObjectInputStream objectInputStream = new ObjectInputStream(inStream);
provinces = (ArrayList<Province>) objectInputStream.readObject();
arrayAdapter = new ArrayAdapter(this,R.layout.text_spinner_item, provinces);
provinceSpinner.setAdapter(arrayAdapter);
Log.e("provinceSpinner", "Adapter OK");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("FileNotFoundException", "provinces not found");
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("StreamCorruptedException", e.toString(), e);
} catch (IOException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("IOException", e.toString(), e);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
findProvince = true;
Log.e("ClassNotFoundException", e.toString(), e);
}
if(findProvince){
progressDialog = new ProgressDialog.Builder(this).
setTitle(R.string.finding).
setMessage(R.string.finding_province).
create();
progressDialog.show();
new Thread(this).start();
}
provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(final AdapterView<?> parent, View view,
final int position, long id) {
// TODO Auto-generated method stub
curProvince = (Province) parent.getItemAtPosition(position);
if (curProvince.getCitys().size() < 1){
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", OPEN_FIND_CITY_DIALOG);
weatherHandler.sendMessage(mes);
new Thread(new Runnable() {
@Override
public void run() {
WeatherService weatherService = new WeatherService();
weatherService.getProvinceCitys(curProvince);
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", GET_CITY_DATA_TYPE);
mes.getData().putParcelableArrayList("value",curProvince.getCitys());
weatherHandler.sendMessage(mes);
}
}).start();
}else{
arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, curProvince.getCitys());
citySpinner.setAdapter(arrayAdapter);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
private void setHandlerMessage() {
weatherHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
int type = msg.getData().getInt("type");
switch (type) {
case GET_SUPPORT_DATA_TYPE:
provinces = msg.getData().getParcelableArrayList("value");
arrayAdapter = new ArrayAdapter(WeatherView.this, R.layout.text_spinner_item,provinces);
provinceSpinner.setAdapter(arrayAdapter);
progressDialog.dismiss();
break;
case GET_CITY_DATA_TYPE:
ArrayList<City> cityList = msg.getData().getParcelableArrayList("value");
arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, cityList);
curProvince.setCitys(cityList);
citySpinner.setAdapter(arrayAdapter);
progressDialog.dismiss();
break;
case OPEN_FIND_CITY_DIALOG:
progressDialog = new ProgressDialog.Builder(WeatherView.this).
setTitle(R.string.finding).
setMessage(R.string.finding_city).
create();
progressDialog.show();
}
}
};
}
@Override
public void run() {
// TODO Auto-generated method stub
WeatherService weatherService = new WeatherService();
ArrayList<Province> provinceList = weatherService.getProvinceList();
try {
FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(provinceList);
objectOutputStream.flush();
objectOutputStream.close();
outStream.close();
Log.e("FileOutputStream", "Over");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("FileOutputStream Exception", e.toString(), e);
}
Message mes = weatherHandler.obtainMessage();
mes.getData().putInt("type", GET_SUPPORT_DATA_TYPE);
mes.getData().putParcelableArrayList("value", provinceList);
weatherHandler.sendMessage(mes);
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
// 退出程序的时候把province信息存储在二进制文件中
try {
FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);
objectOutputStream.writeObject(provinces);
objectOutputStream.flush();
objectOutputStream.close();
outStream.close();
Log.e("FileOutputStream", "Over");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("FileOutputStream Exception", e.toString(), e);
}
super.onBackPressed();
}
}
运行结果如图:
相关文章推荐
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- android 子线程通过bundle、handler.sendMessage(message)向主线程传输多个类型数据,包括list<Map<String,Object>>
- Android两个Activity之间传递List<Object>对象
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- android sharedpreferences 保存 list<Map<String,Object>>数据
- Android中List与Map<String,Object>及SimpleAdapter用来存储数据并展示出来的联合用法
- Android中将List<Map<String, Object>>类型数据与字符串的相互转化
- FreeMarker解析List<JSONObject>数据的疑惑
- android intent传递HashMap<String, Object>
- 如何判断List<Object>中是否包含,一个有相同xxx某个属性实体类
- List<Object[]>反射转成为List<T>
- Java List<Object>根据Object中某一个属性排序
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- ASP.NET.MVC--注解和反射将Enum转换List<SelectListItem>为@Html.DropDownListFor()下拉列表的通用方法
- JS 使用List<Object> 对象中的Object对象的某个属性的临时处理方法
- C#泛型列表List<T>基本用法总结
- Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)
- 去除List<Map<String,Object>>中的map中的重复值