你好,游客 登录 注册 搜索
背景:
阅读新闻

第104章、Android访问WebService(从零开始学Android) - jianghuiquan的专栏

[日期:2013-03-25] 来源:  作者: [字体: ]

  天气预报、手机归属地查询……,包括与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"/>

五、运行结果
  

  





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻