此篇文章主要针对初学者,讲述了如何如何利用webservice访问天气预报接口获取网络数据,对返回结果的处理,以及如何利用Handler更新主线程UI。先看效果图:
接下来看主程序:
package com.example.getweather; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Color; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private EditText cityname; private Button btn; private TextView textView; private final int duration=Toast.LENGTH_LONG; private String theCityName; private String result; private ProgressDialog progressDialog; @SuppressLint("HandlerLeak") private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { progressDialog.dismiss(); switch (msg.what) { case 1: LinearLayout myLayout=(LinearLayout) findViewById(R.id.myLinearLayout); PraseWeaTherUtil p=new PraseWeaTherUtil(result.substring(8, result.length()-2)); textView.setText("所在省/直辖市:"+p.getProvince()); myLayout.addView(getTextView("所在市:"+p.getCity())); myLayout.addView(getTextView("时间:"+p.getTime())); myLayout.addView(getTextView("温度:"+p.getNowDayTemperature())); myLayout.addView(getTextView("今日天气:"+p.getNowDayWeaTher())); myLayout.addView(getTextView("天气实况:"+p.getNowDayWeaTher_Detail())); myLayout.addView(getTextView("风力:"+p.getWind_power())); myLayout.addView(getTextView("明日天气:"+p.getWeaTher_Detail2())); myLayout.addView(getTextView("温度:"+p.getTemperature2())); myLayout.addView(getTextView("后天天气:"+p.getWeaTher_Detail3())); myLayout.addView(getTextView("温度:"+p.getTemperature3())); break; case -1: Toast.makeText(getApplicationContext(), "获取数据失败", duration).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=(TextView)findViewById(R.id.textview); cityname=(EditText)findViewById(R.id.cityname); btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { theCityName=cityname.getText().toString(); if(null==theCityName||"".equals(theCityName)){ Toast.makeText(getApplicationContext(), "请填写要查询的城市", duration).show(); return; } progressDialog=new ProgressDialog(MainActivity.this); progressDialog.setMessage("正在获取天气数据..."); progressDialog.show(); new Thread(new GetWeatherTask(theCityName)).start(); } }); } private class GetWeatherTask implements Runnable{ String theCityName=""; public GetWeatherTask(String theCityName) { super(); this.theCityName = theCityName; } @Override public void run() { try{ result=getRemoteInfo(theCityName); handler.obtainMessage(1).sendToTarget(); }catch(Exception e){ e.printStackTrace(); handler.obtainMessage(-1).sendToTarget(); } } } private TextView getTextView(String content){ TextView tv=new TextView(this); tv.setTextSize(16); tv.setTextColor(Color.parseColor("#000000")); tv.setText(content); return tv; } /** * 通过webservice获取城市天气 * @param theCityName * @return */ public String getRemoteInfo(String theCityName) { //http://WebXml.com.cn/getWeatherbyCityName // 命名空间 String nameSpace = "http://WebXml.com.cn/"; // 调用的方法名称 String methodName = "getWeatherbyCityName"; // EndPoint通常是将WSDL地址末尾的"?WSDL"去除后剩余的部分 String endPoint = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx"; // SOAP Action通常为命名空间 + 调用的方法名称 String soapAction = "http://WebXml.com.cn/getWeatherbyCityName"; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); // 设置需调用WebService接口需要传入的两个参数mobileCode、userId rpc.addProperty("theCityName", theCityName); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = true; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); HttpTransportSE transport = new HttpTransportSE(endPoint); try { // 调用WebService transport.call(soapAction, envelope); } catch (Exception e) { e.printStackTrace(); } // 获取返回的数据 SoapObject object = (SoapObject) envelope.bodyIn; return object.getProperty(0).toString(); } }
public PraseWeaTherUtil(String result) { super(); String results[]=result.replace("string=", "").split(";"); this.province=results[0]; this.city=results[1]; this.time=results[4]; this.nowDayTemperature=results[5]; this.nowDayWeaTher=results[6]; this.nowDayWeaTher_Detail=results[10]; this.WeaTher_Detail2=results[13]; this.temperature2=results[12]; this.WeaTher_Detail3=results[18]; this.temperature3=results[17]; }
详细解释已经在代码中写的很清楚,最后不要忘了写入访问网络权限,大家可以下载我的源码参考: