android怎么访问天气webservice,用网上找的链接都不行
首先将省市信息以的形式保存到名为arrays.xml的文件中(我记得貌似一定要把文件名取为arrays.xml)。其中,name属性可以理解为数组名和ID名。这里要注意:省份的顺序要与对应拥有的城市顺序一致。即台湾为最后最后一个省,
在选择城市界面对应的Activity中,通过下面代码将省份列表显示。其中R.array.provinces就是我们上面定义的name属性值。
ArrayAdapter adapter =
ArrayAdapter.createFromResource(this,R.array.provinces,android.R.layout.simple_spinner_item);
provinceSpinner.setAdapter(adapter);
接着,对省份下拉列表进行监听。这里有一个比较麻烦的地方,因为当你选择不同的省份的时候,需要显示该省份对应的城市。面对那么多的省份,如果我们通过if或者switch来操作的话,使得代码很冗长,也难以维护。发现这里是通过R.array.name这种形式来显示下拉列内容的。通过观察R文件,发现了一定的规律。R文件中的array类的int属性值,是根据写入顺序,从0x7f050000开始,逐个+1形成的。即
public static final int provinces=0x7f050000;
public static final int beijing_array=0x7f050001;
public static final int tianjin_array=0x7f050002;
可能R文件中没有按照此顺序排列,不过,不影响这一性质。所以我就想到了只要城市数组的顺序与省份一一对应(上面提到过),就可以通过所选省份的position,跟ID初始值
0x7f050000相加,得出所属城市的数组。具体看看代码
provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener()
{
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
if(position != 0){//选择了省份,position=0时,为“--请选择--”
*0x7f050000为R文件中省份数组对应的id值,只要加上position,即可获得对应选项(省份)的城市
*/
int cityID = 0x7f050000 + position;
ArrayAdapter adapter =
ArrayAdapter.createFromResource(getApplicationContext(), cityID,
android.R.layout.simple_spinner_item);
citySpinner.setAdapter(adapter);
}
}
public void onNothingSelected(AdapterView parent) {
}
});
二。
三、SQLite保存城市数据
使用SQLite而不使用Intent传递参数,是因为当用户下次打开程序时,当前城市应该为TA最后一次的选择。关于SQLite的使用,网上有很多文章,比如:52android.blog.51cto.com/2554429/478368
之前也学习过一些,但四、PreferenceActivity作为设置界面
参照Android系统的设置,用PreferenceActivity来对系统进行信息配置和管理。这里我也采用PreferenceActivity作为设置界面。(上方图三)
首先,编写xml文件。PreferenceCategory:类别(用于分组)。key:唯一标识(获取信息时使用)。title:显示标题。summary:小标题。还有defaultValue:默认值。我这里值用到了CheckBoxPreference,它还有EditTextPreperence,RingtonePreference,ListPreference,Preference等。
schemas.android.com/apk/res/android"
android:key="threeDay"
android:summary="今明后三天的天气预报,如果不选,则只有当天的天气"
android:title="三天预报" /
android:key="cityInfo"
android:summary="关于当前城市的简要介绍"
android:title="城市简介" /
然后,新建Activity继承 PreferenceActivity
,重写onCreate方法,通过addPreferencesFromResource(R.xml.xx); 加载Preference。
?
public class SetupActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setup);
}
}
最后,获取preference数据。可 通过下面三种方式:
1、getPreferences():可以获取同一activity中的preference;
2、getSharedPreferences():可以获取应用级别的preferences,即封装在同一app中,使用SharePreferences
prefs = getSharedPreferences(packName+name ,0)
3、getDefaultSharedPreferences():通过Android的管理器来获取其所管理的preferences。
由于这里不是同一个Activity,所以不能使用getPreferences()。我这里只有一个preference,因此使用PreferenceManager.getDefaultSharedPreferences(this);来获取较方便。
五、通过WebService获取天气信息
WebService获取天气的网址为:webxml.com.cn/webservices/weatherwebservice.asmx上面
// 保存获取到的信息
SoapObject detail = null;
// 1.实例化SoapObject对象
SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME);
// 2.如果方法需要参数,设置参数
soapObject.addProperty("theCityName", cityName);
// 3.设置Soap的请求信息,获得序列化envelope,参数部分为Soap协议的版本号
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
// 4.构建传输对象
int timeout = 10000;// 设置超时为10秒
MyAndroidHttpTransport httpTransportSE = new MyAndroidHttpTransport(URL,
timeout);
httpTransportSE.debug = true;
// 5.访问WebService,第一个参数为命名空间 + 方法名,第二个参数为Envelope对象
httpTransportSE.call(SOAP_ACTION, envelope);
detail = (SoapObject) envelope.getResponse();// 获取详细天气信息
if (detail != null) {// 当前城市有天气信息
return parseWeather(detail);//解析天气
}
这里要注意一下,代码18行
MyAndroidHttpTransport为继承了HttpTransportSE的内部类。虽然ksoap2版本中的HttpTransportSE已经可以设置timeout(超时时间),但是运行后发现没有效果。查找资料后,才知道HttpTransportSE的源码中并没有把timeout作为参数传递给ServiceConnectionSE。因此我们需要创建一个类,使得timeout起作用。
class MyAndroidHttpTransport extends HttpTransportSE {
private int timeout = 20000; // 默认超时时间为20s
public MyAndroidHttpTransport(String url) {
super(url);
}
public MyAndroidHttpTransport(String url, int timeout) {
super(url);
this.timeout = timeout;
}
//此方法使得超时有效
public ServiceConnection getServiceConnection() throws IOException {
ServiceConnectionSE serviceConnection = new
ServiceConnectionSE(this.url,timeout);
return serviceConnection;
}
}
现在来说创建service的过程
1、新建类继承Service;
2、必须重写onBind方法(如果你通过bindService方法启动service,则在这个方法内执行操作)
3、重写onStart方法(由于本程序中,每次点击查询按钮,service就要进行联网操作,因此我通过startService方法启动service,则每次startService,都会执行onStart方法。注意:在service停止前,onCreate只会执行一次)
4、在AndroidManifest.xml文件中添加
className为类名全称:如vaint.wyt
.service.WeatherService。如果跟MainActivity在同一个包,可以直接写 .WeatherService。
serviceName为startService(new Intent(String
action))的action,bindService类似。
5、在需要启动service的地方,添加一下代码
Intent intent =new Intent("WeatherService");
//传递数据,可以由onStart接收
intent.putExtra("city", city);
this.startService(intent);
6、如果是通过bindService启动service,则可以不执行unbindService。因为只要程序退出,service也将被摧毁。但是,如果是通过startService启动service,则必须通过stopService将其停止,否则即使程序退出,service依旧在运行。我们可以在MainActivity的onDestroy中执行stopService。
protected void onDestroy() {
//停止service
stopService(new Intent("WeatherService"));
super.onDestroy();
}
七、用BroadcastReceiver实现从service到Activity的通信
这只是其中一种方法而已。
1、创建广播接收器。(可以直接在MainActivity中作为内部类创建)重写onReceive方法,接收从service传递过来的天气信息。
//定义一个广播接收器,用于接收Service获得的天气信息
class MyBroadcastRecever extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String[] weatherInfo = intent.getStringArrayExtra("weather");
if(weatherInfo==null){
Toast.makeText(MainActivity.this, "没有当前城市的天气信息", 1000).show();
}else if(weatherInfo.length==1){//即weatherInfo = new
String[]{"timeOut"};
Toast.makeText(MainActivity.this, "连接超时,请检查网络", 1000).show();
}else{
showWeather(weatherInfo);
}
}
}
2、通过代码动态注册广播接收器。(也可以在AndroidManifest中添加属性 )
//注册广播接收器
IntentFilter filter = new IntentFilter();
myBroadcastRecever = new MyBroadcastRecever();
//设置接收广播的类型,这里要和Service里设置的类型匹配,还可以在AndroidManifest.xml文件中注册
//BROADCAST_ACTION=“某个自定义字符串”。如果有多个广播,则要唯一
filter.addAction(BROADCAST_ACTION);
registerReceiver(myBroadcastRecever, filter);
3、通过广播发送消息
Intent i = new Intent();
i.putExtra("weather", weather);
//BROADCAST_ACTION与注册时的字符串一致
i.setAction(BROADCAST_ACTION);
sendBroadcast(i);
麻烦用比较通俗易懂的语言帮我介绍一下JMS,中间件,webService,WSDL以及SOAP之间的关系.
其实解释这几个概念应从WebService开始,这个懂了,其他的都与之相关,也就容易理解了...
WebService 即网络服务...是下一代互联网的发展方向...就是某些公司,用他们的技术提供一些功能的实现,然后对外提供接口,让外界用户调用... 比如:某公司通过其技术,可以获得天气预报的信息,这样它就可以向外界提供一个方法,你调用了这个方法,就可以获取天气预报的信息string字段(举个例子而已,不一定是string这么简单的类型),这就是一种服务...就是WebService...
WSDL:是对如何调用这个接口,应该传怎样的参数,获取的数据怎样分析...等等的XML说明文档...
SOAP:是在这个提供服务与接收服务之间存在的信息交换的通信协议...(其实学习WebService这些东西了解一下就行了,没必要深究)
JMS:JAVE的消息提供平台... 就是一些规范...真没必要懂...
中间件:是一种独立的软件系统或服务系统,用于提供服务... 你可以理解成API...
如果有疑问的话,继续联系我... 红包拿来... 嘿嘿
如何获取天气预报的wsdl
1、天气预报web services地址
用浏览器打开此地址,保存页面为Weather.xml
2、新建一个java工程 webservices
建立包名 com.test.ws
将Weather.xml拷贝到src目录下
3、编写批处理WSDL-SQUARED.CMD,使用wsdj2java生成客户端调用代码
set AXIS_HOME=D:\axis-1_4
set CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar
java org.apache.axis.wsdl.WSDL2Java -p com.test.ws Weather.xml
请教如何利用WebService,WeatherWebService 来获取地方的天气预报
解决方案 »
FormCreate中,把HTTPRIO1.WSDLLocation的赋值语句调到最上面,即procedure TForm1.FormCreate(Sender: TObject);
begin
HTTPRIO1.WSDLLocation := '';
HTTPRIO1.Service := 'WeatherWebService';
HTTPRIO1.Port := 'WeatherWebServiceSoap';
// HTTPRIO1.WSDLLocation := '';
end;
D2007中测试通过
PHP 页面调用天气预报web服务 我想在一个PHP页面直接调用现成的webservice
完全可以。前提是要打开soap扩展,调用方法如下:
?php
$client = new SoapClient('');
$parm=array('theCityCode'='三亚','theUserID'='');
$result=$client-getWeather($parm);
print_r($result);
?
怎么调用网络上免费的webservice服务
如果你用asp.net,那调用webservice是很简单的事情.引用了之后,就跟调用函数似的.
网友评论