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端传来的集合类消息啦,我这里是要获得服务端的标题信息。经测试,能够实现。接收的问题解决了,对于传递的问题我们在后面还要做分析。我们如何才能将一个复杂型数据类型传送到服务端,请看下一篇。

 

 

 

posted @ 2013-05-16 12:14  蠢驴  阅读(336)  评论(0)    收藏  举报