本人是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中读写sd卡文件
  2. Android 支持的文件类型
  3. Android下载文本文件和mp3文件
  4. android project 文件夹
  5. Android 多国语言文件夹
  6. android shape用法(xml文件)
  7. android文件关联之mime type
  8. ubuntu共享文件夹设置
  9. android文件读取

随机推荐

  1. 通过Android Studio查看SDK源码
  2. 转帖并消化:Android中一种使用AttributeS
  3. AlterDialog详细讲解
  4. Android中Activity界面展示与跳转及数据
  5. Android Intent (2) Serializable vs Par
  6. push研究——Apache Mina探索初步
  7. Could not find *****/adb.exe!的解决方
  8. 解决Android Studio连不上Android设备真
  9. 诺基亚推出Android平板N1和Z Launcher
  10. Android(安卓)动画