本人是C#程序猿,但是随着Android的不断流行也慢慢的开始学习Android。在不断的学习中想把Android自带数据Sqlite中的数据同步到Sql中,于是就想到Android调用WCF同步数据。

1)首先创建WCF

新建ASP.NET Web空Web应用程序,在应用程序中添加WCF服务“Service1.svc”。

添加WCF服务“Service1.svc”后我们可以看到应用程序中多了接口文件“IService1.cs”和服务文件“Service1.svc”。

修改接口文件“IService1.cs”代码如下

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace WCFDemo{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。    [ServiceContract(Namespace = "http://chad.cao")]//在Android调用WCF时需要Namespace    public interface IService1    {        [OperationContract]        void DoWork();        [OperationContract]        string HelloWorld(string _name);    }}
修改服务文件“Service1.svc”代码如下

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;namespace WCFDemo{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。    public class Service1 : IService1    {        public void DoWork()        {        }        public string HelloWorld(string _name)        {            return _name + " hello world!";        }    }}

2)将WCF发布到IIS

如我的WCF发布URL是http://192.168.2.102/AndroidUseWCF/Service1.svc

3)Android调用WCF

Android调用WCF是我在这里用的是ksoap2,ksoap2下载路径如下:http://download.csdn.net/detail/czh4869623/6601997

有了ksoap2后如何调用,这个问题对Android高手是多余的,但是很多新手应该还是需要讲解一下的

首先我们讲ksoap2粘贴到项目的“libs”目录下,然后点击Eclipse的"Project"下的“Properties”选项卡,接下来选择左边的“Java Build Path”后在右边选择“Libraries”选项卡,单机“Add JARs...”按钮通过浏览到当前项目下的"libs"目录将ksoap2添加。

接下来我们打开Eclipse新建Android Application Project,然后创建接口“ISoapService”和实现接口类“SoapService”

接口“ISoapService”代码如下

package com.example.androidusewcf;import org.ksoap2.serialization.SoapObject;public interface ISoapService {SoapObject HelloWorldResult();}

实现接口类“SoapService”代码如下,主要是实现调用WCF

package com.example.androidusewcf;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;public class SoapService implements ISoapService{/*和WCF ServiceContract中的Namespace一致*/private static final String NAMESPACE="http://chad.cao";/*方法名*/private static final String METHODNAME="HelloWorld";/*WCF在iis中的调用路径(http://服务器/虚拟目录/服务)*/private static final String URL="http://192.168.2.102/AndroidUseWCF/Service1.svc";/*Namespace/服务接口/方法*/private static final String SOAPACTION="http://chad.cao/IService1/HelloWorld";private String name;public SoapService(String _name){this.name=_name;}public SoapObject HelloWorldResult(){SoapObject result=null;SoapObject soapObject=new SoapObject(NAMESPACE, METHODNAME);soapObject.addProperty("_name", name);//传参,记住参数名必须和WCF方法中的参数名一致SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut=soapObject;envelope.dotNet=true;envelope.setOutputSoapObject(soapObject);HttpTransportSE transportSE=new HttpTransportSE(URL);transportSE.debug=true;//使用调式功能try {transportSE.call(SOAPACTION, envelope);result=(SoapObject) envelope.bodyIn;} catch (Exception e) {String exceptionString=e.toString();}return result;}}

然后在MainActivity.java中调用类,重点提醒:MainActivity中调用类“SoapService”实现调用WCF时必须在子线程中实现,不然将会报主线程异常,MainActivity.java具体代码如下

package com.example.androidusewcf;import org.ksoap2.serialization.SoapObject;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {private TextView textView1=null;    /* 在MainActivity中定义Handler对象作为成员变量      * 通过Handler这个对象对主线程中的控件进行更新      * */      private Handler handler=new Handler(){          public void handleMessage(Message msg){              switch (msg.what) {              case 0:                  /*取出参数更新控件*/                  textView1.setText(msg.getData().getString("_result"));                  break;              default:                  break;              }              super.handleMessage(msg);          }      };      private Runnable myRunnable=new Runnable() {          @Override          public void run() {              /*传参*/              Message msg=new Message();              msg.what=0;              SoapService soapService=new SoapService("chad.cao");    SoapObject soapObject=soapService.HelloWorldResult();    String result=soapObject==null?"网络连接失败!":soapObject.getProperty(0).toString();            Bundle bundle=new Bundle();              bundle.putString("_result", result);            msg.setData(bundle);              /*发送信息到Handler*/              handler.sendMessage(msg);          }      }; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView1=(TextView)findViewById(R.id.textView1);new Thread(myRunnable).start();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
最后记得修改AndroidManifest.xml文件添加权限




更多相关文章

  1. 详解 Android(安卓)的 Activity 组件
  2. [置顶] android调用第三方库——第二篇——编写库android程序直
  3. Kotlin让Android更简单~
  4. Android与js交互实例
  5. Android系统服务概要
  6. 如何调用Android隐藏API
  7. 在Android(安卓)Studio 编写应用程序,在模拟器中显示“我对Androi
  8. Android(安卓)requires compiler compliance level 5.0 or 6.0.
  9. lua学习笔记 1 android 调用Lua, Lua脚本中启动Intent

随机推荐

  1. Serializable和Parcelable的解析与使用
  2. android(1)(四种点击事件)
  3. Android init.rc init.vendor.rc 介绍
  4. android 蓝牙知识链接汇总
  5. HandlerThread的使用
  6. 2011.09.13(3)——— android 添加快捷方式
  7. Android获取本机蓝牙地址
  8. Error:Android Source Generator: Cannot
  9. Gradle:Android打包动态传参及多productFl
  10. BadgeView 与 RadioButton