Android 客户端与后台数据交互的方式有很多种。今天这里记录一下,与WebService的数据交互。
新建一个简单的WebService 创建方式如下:

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

创建好的项目是这样的。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

我们在里面写几句简单的代码,如下:

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

这样,我们的WebService就写好了,接下来我们进行发布。右击项目,选择发布。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

选择文件系统,这里我直接发布到本地IIS里面了。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

这样就发布结束了,接下来,我们直接打开本地 IIS。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

右击login.asmx。点击浏览就可以在默认浏览器中打开了。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

这样我们的WebService就结束了。接下来是Android 客户端了。
这里我们首先需要一个jar包。这里我用的是 kSOAP2  下载地址: http://www.oschina.net/p/ksoap2+android
下载之后,我们直接把jar包放到libs里,然后右击,在弹出菜单中点击Add As Library.

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP然后弹窗,点击确定就好了。Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

下面我们开始写代码。
先写了一个简单的布局页面。

Android 使用 ksoap2-android 访问WebService(C#)-LMLPHP

代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"> <EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:hint="Account"
android:ems="10"
android:id="@+id/AccounText"
android:layout_marginTop="34dp"
android:layout_alignParentTop="true"
android:layout_alignStart="@+id/PwdText" /> <EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:hint="Password"
android:ems="10"
android:id="@+id/PwdText"
android:layout_marginTop="24dp"
android:layout_below="@+id/AccounText"
android:layout_centerHorizontal="true" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"
android:id="@+id/button"
android:layout_below="@+id/PwdText"
android:layout_centerHorizontal="true"
android:layout_marginTop="36dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容"
android:id="@+id/textView"
android:layout_below="@+id/button"
android:layout_marginTop="24dp"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true" />
</RelativeLayout>
然后是主Activity 代码如下:

下面代码中有几个注意点 NAMESPACE、MYURL、METHODNAME。其中NAMESPACE 对应上面我们WebService命名空间,我这里是默认的命名空间。

MYURL 对应的地址不止当前WebService 的地址,而是引用方法的具体地址 上面已经说过了。METHODNAME  是调用的方法名

package com.example.administrator.login1;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE; public class MainActivity extends Activity { private EditText accountet,pwdet;
private Button loginbtn;
private TextView textView;
private myHandler myHandler =new myHandler(); private final String

NAMESPACE

="http://tempuri.org/";                               //WebService 服务器命名空间
private final String

MYURL

="http://172.18.216.7/login/login.asmx";    //方法的详细地址
private final String

METHODNAME

="login1";                                            //具体的方法名称

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView(); //登录按钮
loginbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { new Thread(new Runnable() {
@Override
public void run() { try {
SoapObject request = new SoapObject(

NAMESPACE,METHODNAME

 );

                            request.addProperty("name", accountet.getText().toString());
request.addProperty("pwd", pwdet.getText().toString()); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE ht = new HttpTransportSE(

MYURL

);

                            ht.call(

NAMESPACE+METHODNAME

, envelope);
                            //返回对象应为Object 否则会出现转换异常错误

Object

 soapObject = (

Object

) envelope.getResponse();
                            //发送消息更新UI

                            Message msg2 = new Message();
Bundle bundle = new Bundle();
bundle.putString("result", soapObject.toString());
msg2.what = 1;
msg2.setData(bundle);
myHandler.sendMessage(msg2); }catch (Exception e) {
Log.e("lyf",e.toString());
e.printStackTrace();
}
}
}).start();
}
});
} private void initView()
{
accountet= (EditText) this.findViewById(R.id.AccounText);
pwdet= (EditText) this.findViewById(R.id.PwdText);
loginbtn = (Button) this.findViewById(R.id.button);
textView= (TextView) this.findViewById(R.id.textView);
} class myHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
//更新TextView 显示返回结果
textView.setText(msg.getData().getString("result"));
break;
} super.handleMessage(msg);
}
}
}
04-26 05:26