Android 天气预报2

本文介绍了一款基于WebService的天气应用开发流程,包括获取国内外地区信息、城市天气预报等核心功能实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面已经讲过了基于JSON数据解析的天气预报的开发,这次我们主要涉及的是基于WebService的天气预报。
学习WebService需要具备以下知识。
1.SOAP(Simple Object Access Protocol)
[简单对象访问协议](http://zh.wikipedia.org/zh-cn/SOAP)
2.WSDL(Web Service Discription language)
[WebService描述语言](http://zh.wikipedia.org/zh-cn/WSDL)
3.UDDI(Universal Description ,Description and Integration)
[统一描述,发现和整合协议](https://zh.wikipedia.org/zh-cn/UDDI)
这里涉及到的是对SOAP操作
首先看我们的wsdl源:http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl


如果需要对WSDL想了解的话。请猛点
1.http://www.w3school.com.cn/wsdl/index.asp 
2.http://www.360doc.com/content/08/1113/23/56145_1920514.shtml


首先我们通过这里的wsdl的信息得知有如下方法
1.getRegionCountry 
获得国外国家名称和与之对应的ID
输入参数:无,返回数据:一维字符串数组。、
2.getRegionDataset 
获得中国省份、直辖市、地区;国家名称(国外)和与之对应的ID
输入参数:无,返回数据:DataSet。
3.**getRegionProvince 
获得中国省份、直辖市、地区和与之对应的ID
输入参数:无,返回数据:一维字符串数组。
4.getSupportCityDataset 
获得支持的城市/地区名称和与之对应的ID
输入参数:theRegionCode = 省市、国家ID或名称,返回数据:DataSet。
5.**getSupportCityString 
获得支持的城市/地区名称和与之对应的ID
输入参数:theRegionCode = 省市、国家ID或名称,返回数据:一维字符串数组。
6.**getWeather 
获得天气预报数据
输入参数:城市/地区ID或名称,返回数据:一维字符串数组。
这里只是用到了加黑的方法。方法如下
1.到code.google.com/p/ksoap2-android/下载jar文件(ksoap-android-assembly.jar)这里可以从附件中获得。
2.将jar添加到项目中。加入Build Path
3.如何使用ksoap-android
        1.创建HttpTransportSE对象,调用WebService
        2.创建SoapSerializationEnvelope对象
        3.SoapObject对象创建,传图方法和命名空间
        4.为SoapObject设置属性值
        5.设置SoapObject为SoapSerializationEnvelope的传出消息
        6.调用call()
        7.利用SoapSerializationEnvelope读出对象,获得属性值。
见代码
package com.cater.weather;


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


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;


import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;


public class WeatherActivity extends Activity
{
private final static String uri = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
private final static String namespace = "http://WebXml.com.cn/";
private static HttpTransportSE httpTransportSE;
private static SoapSerializationEnvelope envelope;
private static SoapObject soapObject;
private Spinner provinceSpinner;
private Spinner citySpinner;
private EditText editText;


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.weather);
provinceSpinner = (Spinner) findViewById(R.id.spinner1);
citySpinner = (Spinner) findViewById(R.id.spinner2);
editText = (EditText) findViewById(R.id.editText1);
httpTransportSE = new HttpTransportSE(uri);
httpTransportSE.debug = true;
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
List<String> provinces = getRegionProvince();
ListAdapter provinceAdapter = new ListAdapter(WeatherActivity.this, provinces);
provinceSpinner.setAdapter(provinceAdapter);
provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> view, View parent, int position, long id)
{
List<String> cities = getCityListByProvince(provinceSpinner.getSelectedItem().toString());
ListAdapter cityAdapter = new ListAdapter(WeatherActivity.this, cities);
citySpinner.setAdapter(cityAdapter);
citySpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> view, View parent, int position, long id)
{
showWeather(citySpinner.getSelectedItem().toString());
}


@Override
public void onNothingSelected(AdapterView<?> arg0)
{
}
});
}


@Override
public void onNothingSelected(AdapterView<?> arg0)
{


}
});
}


private void showWeather(String city)
{
SoapObject soapObject = getWeatherByCity(city);
String weatherOfToday = soapObject.getProperty(4).toString();
editText.setText(weatherOfToday);
}


private static List<String> getRegionProvince()
{
String methodName = "getRegionProvince";
soapObject = new SoapObject(namespace, methodName);
envelope.bodyOut = soapObject;
try
{
httpTransportSE.call(namespace + methodName, envelope);
if (envelope.getResponse() != null)
{
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName + "Result");
return parseProvinceOrCity(detail);
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (XmlPullParserException e)
{
e.printStackTrace();
}
return null;
}


private static List<String> parseProvinceOrCity(SoapObject detail)
{
List<String> list = new ArrayList<String>();
for (int i = 0; i < detail.getPropertyCount(); i++)
{
list.add(detail.getProperty(i).toString().split(",")[0]);
}
return list;
}


private static List<String> getCityListByProvince(String province)
{
String methodName = "getSupportCityString";
soapObject = new SoapObject(namespace, methodName);
soapObject.addProperty("theRegionCode", province);
envelope.bodyOut = soapObject;
try
{
httpTransportSE.call(namespace + methodName, envelope);
if (envelope.getResponse() != null)
{
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName + "Result");
return parseProvinceOrCity(detail);
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (XmlPullParserException e)
{
e.printStackTrace();
}


return null;
}


private static SoapObject getWeatherByCity(String cityName)
{
String methodName = "getWeather";
soapObject = new SoapObject(namespace, methodName);
soapObject.addProperty("theCityCode", cityName);
envelope.bodyOut = soapObject;
try
{
httpTransportSE.call(namespace + methodName, envelope);
if (envelope.getResponse() != null)
{
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName + "Result");
return detail;
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (XmlPullParserException e)
{
e.printStackTrace();
}
return null;
}


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


public ListAdapter(Context context, List<String> list)
{
this.context = context;
this.list = list;
}


@Override
public int getCount()
{
if (list == null)
{
return 0;
}
return list.size();
}


@Override
public Object getItem(int position)
{
if (list != null)
{
return list.get(position);
}
return null;
}


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


@Override
public View getView(int position, View convertView, ViewGroup parent)
{
TextView textView = new TextView(context);
textView.setTextColor(Color.BLACK);
textView.setText(list.get(position));
return textView;
}


}
}
内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来在这儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值