标签:android web service 通信
1.创建安卓项目KSoapTest
2.一路Next
3.添加ksoap2-android-assembly-3.1.0-jar-with-dependencies.jar到项目
(稍后的完整项目下载后会包含这个jar包)
4.编辑 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="56dp"
android:text="点击访问服务端HelloWorld" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="86dp"
android:text="TextView" />
</RelativeLayout>
5.添加基类Activity类:BaseKsoapActivity.java,代码如下:
package com.example.base;
import java.util.Iterator;
import java.util.Map;
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.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
/**
*
* @author WangPeng
* 2015年8月7日11:24:49
* 集成该类的Activity可以方便的调用Web Service进行通信
*
*/
@SuppressWarnings("all")
public abstract class BaseKsoapActivity extends Activity{
// 服务器链接
final String WEB_SERVICE_URL = "http://%s/TestService.asmx?wsdl";
// 命名空间
final String Namespace = "http://tempuri.org/";
//服务器地址
private String ipAddress;
/**
* Activity 创建时候执行
* 获取Web Service所在服务器地址
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//IP地址可以通过配置来获得
//注意:不能使用127.0.0.1或localhost,因为安卓程序是在手机上运行的,手机不能通过127.0.0.1或localhost访问电脑上的IIS
//这里我使用的是我电脑的无线网卡的IP地址,我的手机也连接在这个无线网上
this.ipAddress = "192.168.20.133";
}
/**
*
* @param paras
*/
protected void Request(Object... paras) {
new AsyncTask<Object, Object, SoapObject>() {
@Override
protected SoapObject doInBackground(Object... args) {
// 1、指定Web Service的命名空间和调用的方法名
String MethodName = (String) args[0];
SoapObject request = new SoapObject(Namespace, MethodName);
//2、设置调用传递的参数
Map<String, Object> paras = (Map<String, Object>) args[1];
// 2、设置调用方法的参数值,如果没有参数,可以省略,
if (paras != null) {
Iterator iter = paras.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
request.addProperty((String) entry.getKey(), (String) entry.getValue());
}
}
// 3、生成调用Web Service方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
envelope.bodyOut = request;
// c#写的应用程序必须加上这句
envelope.dotNet = true;
HttpTransportSE ht = new HttpTransportSE(String.format(WEB_SERVICE_URL, ipAddress));
// 使用call方法调用WebService方法
try {
ht.call(null, envelope);
} catch (Exception e) {
publishProgress("网络错误", "网络连接失败,请检查设备是否处于联网状态,并且已配置服务器地址。");
return null;
}
try {
SoapObject obj = (SoapObject) envelope.bodyIn;
return obj;
} catch (Exception e) {
publishProgress("网络错误", "服务器端返回结果");
return null;
}
}
@Override
protected void onPostExecute(SoapObject obj) {
super.onPostExecute(obj);
requestCallBack(obj);
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
if (values != null && values.length == 2) {
ShowMessage((String) values[0], (String) values[1]);
}
}
}.execute(paras);
}
protected void ShowMessage(String title, String msg) {
new AlertDialog.Builder(this).setTitle(title).setMessage(msg).setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
/**
* 所有继承这个Activity的类都必须实现这个方法
* 每次通信结束都会调用这个方法
*
* @param obj 和服务器通信得到的返回值
*/
protected abstract void requestCallBack(SoapObject obj);
}
6.编辑MainActivity,继承上面的BaseKsoapActivity,代码如下:
package com.example.ksoaptest;
import java.util.HashMap;
import java.util.Map;
import org.ksoap2.serialization.SoapObject;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.example.base.BaseKsoapActivity;
public class MainActivity extends BaseKsoapActivity {
private Button btn;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.button1);
tv = (TextView)findViewById(R.id.textView1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Map<String, Object> paras = new HashMap<String, Object>();
//paras.put("参数名","参数值");
Request("HelloWorld", paras);
}
});
}
@Override
protected void requestCallBack(SoapObject obj) {
//复杂一点的返回值需要解析,我们这里返回的是String,所以解析比较简单
//对于复杂的返回类型,个人建议在服务端转换成JSON字符串后返回,
//这样客户端只要得到这个字符串扔给第三方的Gson或jsonlib就可以转换成需要的对象
//而且对于byte数组这样的返回值通过xml传输会加上很多无用的标签,增加了传输的数据量,降低效率
tv.setText(obj.getProperty(0).toString());
}
}
7.在AndroidManifest.xml添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
8.运行
9.C#和安卓完整代码已上传
http://download.csdn.net/detail/u013816347/8999889
欢迎评论指正
版权声明:本文为博主原创文章,转载的时候请注明出处。
android与C# WebService基于ksoap通信(Android篇)
标签:android web service 通信
原文地址:http://blog.csdn.net/u013816347/article/details/47610811