自我介绍:本人C#程序猿,有一颗想学Android的心,在做到将Android Sqlite中的数据上传到远程服务器,自然而然的想到用C# 的WCF将数据插入到SQL,以下代码花了本猿猴1个星期的时候,所以想了一下觉得还是总结出来,希望对你有用。

准备工作

Json的下载地址如下
http://download.csdn.net/detail/czh4869623/4742196

Ksoap2的下载地址如下
http://download.csdn.net/detail/czh4869623/6601997


现在让我们来看一下代码

1)首先创建WCF

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

实体类“Person”的代码如下(注意字段要和Android端的实体类字段保持一致)

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace WebApplication197{    public class Person    {        public int PID { get; set; }        public string PName { get; set; }        public string PAddress { get; set; }        public decimal PAccount { get; set; }        public string PDate { get; set; }    }}

添加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 WebApplication197{    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.    [ServiceContract(Namespace = "http://chad.cao")]//在Android调用WCF时需要Namespace     public interface IService1    {        [OperationContract]        void DoWork();        [OperationContract]        Person GetPerson(string _jsonString);        [OperationContract]        List<Person> GetPersons(string _jsonString);    }}


修改服务文件“Service1.svc”代码如下(记得代码中引用Newtonsoft.Json.dll)

using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.Text;using Newtonsoft.Json;using System.IO;namespace WebApplication197{    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.    public class Service1 : IService1    {        public void DoWork()        {        }        public Person GetPerson(string _jsonString)        {            //读取从Android端传来json将其转化为实体类Person            JsonSerializer jsonSerializer = new JsonSerializer();            StringReader reader = new StringReader(_jsonString);            Person item = (Person)jsonSerializer.Deserialize(new JsonTextReader(reader), typeof(Person));            //修改实体类并回传给Android端            Person person = new Person();            person.PID = item.PID + 1;            person.PName = item.PName + "1";            person.PAddress = item.PAddress + "1";            person.PAccount = item.PAccount + 1;            person.PDate = item.PDate + "1";            return person;        }        public List<Person> GetPersons(string _jsonString)        {            //读取从Android端传来json将其转化为List<Person>            JsonSerializer jsonSerializer = new JsonSerializer();            StringReader reader = new StringReader(_jsonString);            List<Person> items = (List<Person>)jsonSerializer.Deserialize(new JsonTextReader(reader), typeof(List<Person>));            //修改List<Person>并回传给Android端            List<Person> persons = new List<Person>();            if (items.Count > 0)            {                foreach (Person item in items)                {                    Person person = new Person();                    person.PID = item.PID + 1;                    person.PName = item.PName + "1";                    person.PAddress = item.PAddress + "1";                    person.PAccount = item.PAccount + 1;                    person.PDate = item.PDate + "1";                    persons.Add(person);                }            }            return persons;        }    }}


2)将WCF发布到IIS

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


3)Android调用WCF

上文中我们已经下载了ksoap2,下载后如何调用,这个问题对Android高手是多余的,但是很多新手应该还是需要讲解一下的
首先我们讲ksoap2粘贴到项目的“libs”目录下,然后点击Eclipse的"Project"下的“Properties”选项卡,接下来选择左边的“Java Build Path”后在右边选择“Libraries”选项卡,单机“Add JARs...”按钮通过浏览到当前项目下的"libs"目录将ksoap2添加。


接下来我们打开Eclipse新建Android Application Project,

首先创建实体类“Person”代码如下

package com.example.androidjsonwcf;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class Person {public Person(){}public Person(Integer _id, String _name, String _address, Double _account, String _date){PID=_id;PName=_name;PAddress=_address;PAccount=_account;PDate=_date;}//要和WebService中字段名称一致private Integer PID;private String PName;private String PAddress;private Double PAccount;private String PDate;//将List转化成json以便于在网络中传输public static String ConvertToJson(List<Person> items){String jsonString="";JSONArray jsonArray=new JSONArray();try {if(items.size()>0){for (Person item : items) {JSONObject jsonObject=new JSONObject();jsonObject.put("PID", item.PID);jsonObject.put("PName", item.PName);jsonObject.put("PAddress", item.PAddress);jsonObject.put("PAccount", item.PAccount);jsonObject.put("PDate", item.PDate);jsonArray.put(jsonObject);}jsonString=jsonArray.toString();}} catch (JSONException e) {e.printStackTrace();}return jsonString;}//将实体对象转化成json以便于在网络中传输public static String ConvertToJson(Person item){String jsonString="";JSONObject jsonObject=new JSONObject();try {jsonObject.put("PID", item.PID);jsonObject.put("PName", item.PName);jsonObject.put("PAddress", item.PAddress);jsonObject.put("PAccount", item.PAccount);jsonObject.put("PDate", item.PDate);jsonString=jsonObject.toString();} catch (JSONException e) {e.printStackTrace();}return jsonString;}public Integer getPID() {return PID;}public void setPID(Integer pID) {PID = pID;}public String getPName() {return PName;}public void setPName(String pName) {PName = pName;}public String getPAddress() {return PAddress;}public void setPAddress(String pAddress) {PAddress = pAddress;}public Double getPAccount() {return PAccount;}public void setPAccount(Double pAccount) {PAccount = pAccount;}public String getPDate() {return PDate;}public void setPDate(String pDate) {PDate = pDate;}}

然后创建接口“ISoapService”和实现接口类“SoapService”

接口“ISoapService”代码如下

package com.example.androidjsonwcf;import java.util.List;public interface ISoapService {List<Person> getPersonsResult(String _methodName, List<Person> _persons);Person getPersonResult(String _methodName, Person _person);}

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

package com.example.androidjsonwcf;import java.util.ArrayList;import java.util.List;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;public class SoapService implements ISoapService{private String NAMESPACE="http://chad.cao";private String URL="http://172.16.18.74/Service1.svc";private String SOAPACTION="http://chad.cao/IService1/";public List<Person> getPersonsResult(String _methodName, List<Person> _persons){List<Person> persons=new ArrayList<Person>();SOAPACTION+=_methodName;//将List<Person>转化成jsonString jsonString=Person.ConvertToJson(_persons);        SoapObject soapObject=new SoapObject(NAMESPACE, _methodName);          soapObject.addProperty("_jsonString", jsonString);//传参,记住参数名必须和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);              if(envelope.getResponse()!=null){            /* GetPersonsResponse{             * GetPersonsResult=anyType{             * Person=anyType{PAccount=12; PAddress=zhejiang1; PDate=2014-01-21 06:57:261; PID=2; PName=chad.cao1; };             * Person=anyType{PAccount=13; PAddress=sichuan1; PDate=2014-01-21 06:57:261; PID=3; PName=catherine.yu1; };              * }; }*/            SoapObject result=(SoapObject)envelope.bodyIn;            SoapObject result1=(SoapObject)result.getProperty(0);            //获取从WCF回传的List<Person>            if(result1.getPropertyCount()>0){            for(int i=0; i<result1.getPropertyCount();i++){            SoapObject personSoapObject=(SoapObject)result1.getProperty(i);            Person person=new Person();            person.setPID(Integer.valueOf(personSoapObject.getProperty("PID").toString()));    person.setPName(personSoapObject.getProperty("PName").toString());    person.setPAddress(personSoapObject.getProperty("PAddress").toString());    person.setPAccount(Double.parseDouble(personSoapObject.getProperty("PAccount").toString()));    person.setPDate(personSoapObject.getProperty("PDate").toString());    persons.add(person);            }            }            }        } catch (Exception e) {              e.printStackTrace();        }          return persons;}public Person getPersonResult(String _methodName, Person _person){Person person=new Person();SOAPACTION+=_methodName;//将实例化的尸体类Person转化成jsonString jsonString=Person.ConvertToJson(_person);//将json作为参数传递给WCFSoapObject soapObject=new SoapObject(NAMESPACE, _methodName);soapObject.addProperty("_jsonString", jsonString);//传参,记住参数名必须和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);if(envelope.getResponse()!=null){/* GetPersonResponse{ * etPersonResult=anyType{PAccount=12; PAddress=zhejiang1; PDate=2014-01-21 06:58:421; PID=2; PName=chad.cao1; }; * }*/SoapObject result=(SoapObject)envelope.bodyIn;if(result.getPropertyCount()==1){//获取从WCF回传的PersonSoapObject personSoapObject=(SoapObject)result.getProperty(0);person.setPID(Integer.valueOf(personSoapObject.getProperty("PID").toString()));person.setPName(personSoapObject.getProperty("PName").toString());person.setPAddress(personSoapObject.getProperty("PAddress").toString());person.setPAccount(Double.parseDouble(personSoapObject.getProperty("PAccount").toString()));person.setPDate(personSoapObject.getProperty("PDate").toString());}}} catch (Exception e) {e.printStackTrace();}return person;}}


然后在MainActivity.java中调用类,重点提醒:MainActivity中调用类“SoapService”实现调用WCF时必须在子线程中实现,不然将会报主线程异常,MainActivity.java具体代码如下
package com.example.androidjsonwcf;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {    private Runnable myRunnable=new Runnable() {          @Override          public void run() {        SoapService soapService=new SoapService();                Date currentDate=new Date(System.currentTimeMillis());    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");    String dateString=simpleDateFormat.format(currentDate);        //Person    /*Person person=new Person(1, "chad.cao", "zhejiang", 11.0, dateString);    Person resultPerson=soapService.getPersonResult("GetPerson", person);*/    //List<Person>    List<Person> persons=new ArrayList<Person>();    persons.add(new Person(1, "chad.cao", "zhejiang", 11.0, dateString));    persons.add(new Person(2, "catherine.yu", "sichuan", 12.0, dateString));    List<Person> resultPersons=soapService.getPersonsResult("GetPersons", persons);    String testString="OK";        }      }; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);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文件添加权限

<uses-permission android:name="android.permission.INTERNET" />

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android 进程间通信原理
  3. 最近研究有关Android中的TextView
  4. [置顶] Android调用JNI的简单实例(附详细步骤)
  5. 用trace32调试android kernel[msm7627为例]
  6. Android开发者证书的创建
  7. 《第一行代码--Android》读书笔记之碎片
  8. Android(安卓)项目模块化开发,提高开发效率。
  9. NDK编程入门

随机推荐

  1. 经典C语言面试题(参考)
  2. 用c语言编写爱心的代码是什么
  3. c语言fun函数有什么作用
  4. C语言strcmp函数用法
  5. C语言怎么换行
  6. sqrt在c语言中怎么用
  7. 字符数组表示字符串的注意事项是什么
  8. C语言的特点与创建的基本步骤是什么
  9. 一个include命令可以指定多个被包含的文
  10. c语言如何求两个数的最大公约数