Android调用WCF(二)
Android调用WCF(二)
2013-05-16 11:37:02
在本篇中要记录一下怎么通过Ksoap2包获得WCF传来的集合类中的消息。若是用上一篇中介绍的方法来接收,则我们得到的返回信息并不是我们想要的,会有很多其他信息一起被接收。下面接收一下实现方法:
1、建立一个ISoapService接口
1 public interface ISoapService { 2 SoapObject LoadResult() throws SoapFault; 3 }
2、建立与WCF交互的类WCFGainArticletitle
1 public class WCFGainArticletitle implements ISoapService { 2 private static final String NameSpace = "http://tempuri.org/";//命名空间 3 private static final String URL = "http://172.16.201.190:8134/Service.svc"; 4 private static final String SOAP_ACTION = "http://tempuri.org/IService/GetArticleTitle"; 5 private static final String MethodName = "GetArticleTitle"; 6 7 private Integer first; 8 private Integer sencond; 9 private Integer top; 10 11 private SoapObject soapObject; 12 private SoapSerializationEnvelope envelope; 13 private HttpTransportSE trans ; 14 15 /** 16 * 设置构造函数 17 * @param first 18 * @param sencond 19 * @param top 20 */ 21 public WCFGainArticletitle(Integer first,Integer sencond,Integer top) { 22 this.first = first; 23 this.sencond = sencond; 24 this.top = top; 25 } 26 27 28 public SoapObject Load_WCF_Result(){ 29 soapInit(); 30 31 try { 32 trans.call(SOAP_ACTION, envelope);//访问webservice服务器 33 SoapObject result = (SoapObject) envelope.getResponse();//获取服务器返回的信息(此处返回的是一个集合) 34 System.out.println("Call Successful!"); 35 return result; 36 } catch (IOException e) { 37 System.out.println("IOException"); 38 e.printStackTrace(); 39 } catch (XmlPullParserException e) { 40 System.out.println("XmlPullParserException"); 41 e.printStackTrace(); 42 } 43 44 return null; 45 } 46 47 48 private void soapInit() { 49 soapObject = new SoapObject(NameSpace, MethodName);//实例化SoapObject对象 50 soapObject.addProperty("NewsCounty", first); 51 soapObject.addProperty("NewsType", sencond); 52 soapObject.addProperty("top", top);//假设方法有参数的话,设置调用方法参数——addProperty("参数名称","参数值"); 53 54 envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // 版本 55 envelope.bodyOut = soapObject;//不要忘了设置 SoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第1步创建的SoapObject对象。 56 envelope.dotNet = true;//设置与.Net提供的Web Service保持较好的兼容性 57 58 trans = new HttpTransportSE(URL);//指定HttpTransportSE 59 trans.debug = true; // 使用调试功能 60 } 61 62 /** 63 * 得到文章标题,并放在List<GetSet_Titles>中 64 */ 65 public List<GetSet_Titles> getArticleTitle() { 66 SoapObject soap = Load_WCF_Result(); 67 68 List<GetSet_Titles> list = new ArrayList<GetSet_Titles>();//建立一个list对象用来加载返回的标题,List是一个集合 69 70 // 若不判断,有空指针异常,因为SoapObject方法中返回的可能是Null 71 if(soap == null){ 72 Toast.makeText(MyApplication.getAppContext(), "返回为空", Toast.LENGTH_SHORT).show(); 73 } 74 int resultCount = soap.getPropertyCount();//得到集合中属性的个数 75 // 找到以anyType命名的集合,并且遍历其中的内容 76 if(soap.getName() == "anyType"){ 77 for(int i = 0; i < resultCount; i++) { 78 GetSet_Titles getSet_Titles = new GetSet_Titles();//实例化对象是必须要的,相当于给getSet_Titles分配了一个内存空间,若没有会报错 79 SoapObject soapChilds = (SoapObject) soap.getProperty(i);//得到集合中的一项数据 80 // 得到一项数据中的“NewsTitle”代表的属性 81 getSet_Titles.setNewsTitles(soapChilds.getProperty("NewsTitle").toString()); 82 list.add(getSet_Titles);//将标题加入list中 83 } 84 } 85 return list; 86 } 87 }
这里的代码与上一篇中的主要去别是使用了SoapObject result = (SoapObject) envelope.getResponse();这个getResponse()方法就是用来接收集合的,若想前一篇使用的是SoapObject result = (SoapObject) envelope.bodyIn;
接只能用来传递字符串了。
代码中还有一个getArticleTitle()方法用来解析服务端传来的信息。具体实现在代码中有说明
3、Android代码:
1 public class AndroidWcfDemoActivity extends Activity { 2 private Button myButton; 3 private TextView myText; 4 private LinearLayout mylayout; 5 6 /** Called when the activity is first created. */ 7 @SuppressLint("NewApi") 8 @Override 9 public void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_android_wcf_demo); 12 myButton = (Button) findViewById(R.id.myButton); 13 myText = (TextView)findViewById(R.id.myText); 14 mylayout = (LinearLayout) findViewById(R.id.mylayout); 15 myButton.setText(R.string.myButton); 16 // 建立一个ListView对象,用来添加SimpleAdapter适配器 17 final ListView listview = new ListView(this); 18 // 建立一个集合对象data,用来存储接收到的信息 19 final List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); 20 21 myButton.setOnClickListener(new Button.OnClickListener() { 22 @Override 23 public void onClick(View v) { 24 25 HelloService service = new HelloService(3,2,10); 26 // 得到标题对象 27 List<ArticleTitles> ariticleTitles = service.getArticleTitle(); 28 // 由于接受到的是一个集合,所以使用增强型for循环 29 for(ArticleTitles titles : ariticleTitles) 30 { 31 HashMap<String,Object> map = new HashMap<String, Object>(); 32 map.put("title", titles.getTitle()); 33 data.add(map); 34 } 35 mylayout.addView(listview); 36 37 SimpleAdapter adapter = new SimpleAdapter(AndroidWcfDemoActivity.this, data, R.layout.listviewrow, 38 new String[] {"title"}, new int[] {R.id.NewsTitle}); 39 listview.setAdapter(adapter); 40 } 41 42 }); 43 } 44 45 46 }
这里使用了SimpleAdapter添加到listView中去,可以对ListView中的Item实现自由布局。
SimpleAdapter adapter = new SimpleAdapter(AndroidWcfDemoActivity.this, data, R.layout.listviewrow,
new String[] {"title"}, new int[] {R.id.NewsTitle});
SimpleAdapter中的第一个属性是Context,第二个就是你要添加到ListView中的资源,第三个是每一项的布局,第四个是你要加入到Item中信息的名字,第五个是你要加入到Item中信息对应的布局ID。
通过以上的这些代码就可以实现接收到WCF端传来的集合类消息啦,我这里是要获得服务端的标题信息。经测试,能够实现。接收的问题解决了,对于传递的问题我们在后面还要做分析。我们如何才能将一个复杂型数据类型传送到服务端,请看下一篇。

浙公网安备 33010602011771号