天气预报、手机归属地查询……,包括与SQL SERVER数据库远程交互都可以通过Web Service搞定。
准备工作:
(1)第一步,下载定位Android locSDK3.3。
下载地址:http://ksoap2-android.googlecode.com/svn/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.6.0/ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar
(2)第二步,修改扩展名zip为jar
下载之后,文件名为:ksoap2-android-assembly-2.6.0-jar-with-dependencies.zip
请修改为:ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar
一、工程配置
1、第一步,在工程里新建libs文件夹,将开发包里的ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar拷贝到libs根目录下,拷贝完成后的工程目录如下图所示;
2、第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定ksoap2-android-assembly-2.6.0-jar-with-dependencies.jar,确定后返回。
通过以上两步操作后,您就可以正常使用Web Service的功能了。
二、设计界面
1、布局文件
打开res/layout/activity_main.xml文件。
输入以下代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/mobile" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone" > <requestFocus /> </EditText> <Button android:id="@+id/search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="手机归属地查询" /> <TextView android:id="@+id/location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" /> </LinearLayout>
三、程序文件
1、MainActivity.java
打开“src/com.genwoxue.baidulocation/MainActivity.java”文件。
然后输入以下代码:
package com.genwoxue.webservice; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private EditText etMobile=null; private TextView tvLocation=null; private Button btnSearch=null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etMobile = (EditText) findViewById(R.id.mobile); tvLocation = (TextView) findViewById(R.id.location); btnSearch=(Button)super.findViewById(R.id.search); btnSearch.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view){ String mobile = etMobile.getText().toString(); PageTask task = new PageTask(); task.execute(mobile); } }); } /* 四个步骤: * (1)onPreExecute(),执行预处理,它运行于UI线程, * 可以为后台任务做一些准备工作,比如绘制一个进度条控件。 * (2)doInBackground(Params...),后台进程执行的具体计算在这里实现, * doInBackground(Params...)是AsyncTask的关键,此方法必须重载。 * 在这个方法内可以使用 publishProgress(Progress...)改变当前的进度值。 * (3)onProgressUpdate(Progress...),运行于UI线程。如果 * 在doInBackground(Params...) 中使用了publishProgress(Progress...),就会 * 触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。 * (4)onPostExecute(Result),运行于UI线程,可以对后台任务的结果做出处理,结果 * 就是doInBackground(Params...)的返回值。此方法也要经常重载,如果Result为 * null表明后台任务没有完成(被取消或者出现异常)。 * */ class PageTask extends AsyncTask<String, Integer, String> { // (1)任务启动 @Override protected void onPreExecute() { tvLocation.setText("task_started"); } //(2)后台执行:主要工作在这里实现(调用WebService就是在这里完成的) @Override protected String doInBackground(String... params) { String result = null; // 命名空间 String nameSpace = "http://WebXml.com.cn/"; // 调用的方法名称 String methodName = "getMobileCodeInfo"; // EndPoint String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"; // SOAP Action String soapAction = "http://WebXml.com.cn/getMobileCodeInfo"; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); // 设置需调用WebService接口需要传入的两个参数mobileCode、userId rpc.addProperty("mobileCode", params[0]); rpc.addProperty("userId", ""); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 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; // 获取返回的结果 result = object.getProperty(0).toString(); return result; } //(3)由doInBackground中的publishProgress(Progress...)触发onProgressUpdate这个方法 @Override protected void onProgressUpdate(Integer... values) { // 更新进度 tvLocation.setText("正在处理中……"+values[0]); } //(4)可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。 @Override protected void onPostExecute(String result) { // 返回HTML页面的内容 tvLocation.setText(result); } } }
四、配置文件
打开“AndroidManifest.xml”文件。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.genwoxue.webservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.INTERNET"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
注意:由于是调用WebService,请注意在AndroidManifest.xml加上由于互联网权限。
<uses-permission android:name="android.permission.INTERNET"/>
五、运行结果