2015-03-31 295 views
0

我有一個webservice,它返回對象的數組列表。 我想在我的android代碼中訪問這個對象的數組列表。我該怎麼做? 我的web服務是訪問Webservice返回值

package com.chillum.first; 

import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.QueryParam; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

@Path("/hello") 
public class ServerSide { 

@GET 
public ArrayList<myClass> Print (@QueryParam("param1") String key) throws IOException, InterruptedException 
{ 
    Date date = new Date(); 
    SimpleDateFormat sdf = new SimpleDateFormat("MMddyyyyhmmss"); 
    String formattedDate = sdf.format(date); 
    String command = "cmd /c start /wait C:\\python27\\tutorial\\check.bat "+key+" "+formattedDate; 
    Process p=Runtime.getRuntime().exec(command); 
    p.waitFor(); 
    myClass[] flipkart=new myClass[500]; 
    myClass[] amazon=new myClass[500]; 
    myClass[] myntra=new myClass[500]; 
    myClass[] jabong=new myClass[500]; 
    myClass[] shopclues=new myClass[500]; 
    myClass[] hs18=new myClass[500]; 
    myClass[] indiatimes=new myClass[500]; 
    myClass[] croma=new myClass[500]; 

    String xmlFileNames[]=new String[8]; 
    xmlFileNames[0]="C:/python27/tutorial/"+formattedDate+"flipkart.xml"; 
    xmlFileNames[1]="C:/python27/tutorial/"+formattedDate+"amazon.xml"; 
    xmlFileNames[2]="C:/python27/tutorial/"+formattedDate+"myntra.xml"; 
    xmlFileNames[3]="C:/python27/tutorial/"+formattedDate+"jabong.xml"; 
    xmlFileNames[4]="C:/python27/tutorial/"+formattedDate+"shopclues.xml"; 
    xmlFileNames[5]="C:/python27/tutorial/"+formattedDate+"hs18.xml"; 
    xmlFileNames[6]="C:/python27/tutorial/"+formattedDate+"indiatimes.xml"; 
    xmlFileNames[7]="C:/python27/tutorial/"+formattedDate+"croma.xml"; 

    String[] domain=new String[8]; 
    domain[0]="http://www.flipkart.com"; 
    domain[1]=""; 
    domain[2]="http://www.myntra.com"; 
    domain[3]=""; 
    domain[4]="http://www.shopclues.com"; 
    domain[5]="http://www.homeshop18.com"; 
    domain[6]="http://www.shopping.indiatimes.com"; 
    domain[7]="http://www.cromaretail.com/"; 


    try { 
     random(flipkart, xmlFileNames[0], domain[0]); 
     random(amazon, xmlFileNames[1], domain[1]); 
     random(myntra, xmlFileNames[2], domain[2]); 
     random(jabong, xmlFileNames[3], domain[3]); 
     random(shopclues, xmlFileNames[4], domain[4]); 
     random(hs18, xmlFileNames[5], domain[5]); 
     random(indiatimes, xmlFileNames[6], domain[6]); 
     random(croma, xmlFileNames[7], domain[7]); 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    ArrayList<myClass> all= new ArrayList<myClass>(); 
    for(int i=0, j=0; i<50; i++, j++) 
    { 
     try 
     { 
      all.add(flipkart[i]); 
      all.add(amazon[i]); 
      all.add(myntra[i]); 
      all.add(jabong[i]); 
      all.add(shopclues[i]); 
      all.add(hs18[i]); 
      all.add(indiatimes[i]); 
      all.add(croma[i]); 
     } 
     catch(NullPointerException npe) 
     { 
     } 
      continue; 
    } 
    return all; 
} 
public static void random(myClass[] obj, String fileName, String domain) throws Exception 
{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    try 
    { 
     Document document = builder.parse(new InputSource(new FileReader(new File(fileName)))); 
     NodeList title = document.getElementsByTagName("title"); 
     NodeList price = document.getElementsByTagName("price"); 
     NodeList link = document.getElementsByTagName("link"); 
     NodeList image = document.getElementsByTagName("image"); 
     for (int i = 0; i < title.getLength(); i++) { 
      int objcount=0; 
      NodeList titleChildList = title.item(i).getChildNodes(); 
      NodeList priceChildList = price.item(i).getChildNodes(); 
      NodeList linkChildList = link.item(i).getChildNodes(); 
      NodeList imageChildList = image.item(i).getChildNodes(); 
      for (int j = 0; j < titleChildList.getLength(); j++) { 
       obj[objcount]=new myClass(); 
       Node titleChildNode = titleChildList.item(j); 
       if ("value".equals(titleChildNode.getNodeName())) { 

        obj[objcount].title=titleChildList.item(j).getTextContent() 
          .trim(); 
       } 
       Node priceChildNode = priceChildList.item(j); 
       if ("value".equals(priceChildNode.getNodeName())) { 
        obj[objcount].price=priceChildList.item(j).getTextContent() 
          .trim(); 
       } 
       Node linkChildNode = linkChildList.item(j); 
       if ("value".equals(linkChildNode.getNodeName())) { 
        obj[objcount].link=domain+linkChildList.item(j).getTextContent() 
         .trim(); 
       } 
       Node imageChildNode = imageChildList.item(j); 
       if ("value".equals(imageChildNode.getNodeName())) { 
        obj[objcount].image=imageChildList.item(j).getTextContent() 
         .trim(); 
       } 
       objcount++; 
      } 
     } 
    } 
    catch(NullPointerException npe) { 
    } 

} 

} 

並返回到Android我的java類是

package com.example.chillum; 

import android.net.http.AndroidHttpClient; 

import com.example.chillum.Utils; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.util.EntityUtils; 

import java.util.ArrayList; 

public class HttpManager { 

public static ArrayList<myClass> getdata(String uri) 
{ 
    AndroidHttpClient client=AndroidHttpClient.newInstance("AndroidAgent"); 
    HttpGet request=new HttpGet(uri); 
    HttpResponse response; 
    try{ 
     response=client.execute(request); 
     return //what?; 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
    finally 
    { 
     client.close(); 
    } 
} 
} 

,我應該什麼樣的回報,使得我得到的數組列表? 這個方法返回到一個異步任務,其他的操作是用arraylist完成的。 請幫忙。

回答

0

您無法使用HTTP將Java對象從服務器傳輸到客戶端。 HTTP使用基本的ASCII文本傳輸數據(因此Hyper 文本傳輸協議)。

需要使用的解決方法是使用標準標記語言對從服務器發送的數據進行編碼。目前使用的主要是JSON和XML。

JSON看起來是這樣的:

{ 
"company": Volkswagen, 
"name": "Vento", 
"price": 800000 
} 

和XML是這樣的:

<car> 
<company>Volkswagen</company> 
<name>Vento</name> 
<price>800000</price> 
</car> 

簡單來說:你必須要發送到JSON/XML發射前的對象轉換到客戶端請求。然後在客戶端使用JSON解碼函數來取回對象。

有相當多的教程來展示如何使用JSON/XML在服務器和Android活動之間傳輸數據。

希望這會有所幫助。