2012-11-14 6 views
0

J'essaie d'obtenir des données d'un WebService en utilisant KSoap2. Le WebService répond à un fichier XML très volumineux, donc pendant que je fais le HttpTransportSE.call(), j'obtiens une exception ouOfMemory.KSoap2 outOfMemoryError lors d'un appel Android

Est-il possible d'obtenir une réponse coupée à partir d'un service Web de savon? Ou existe-t-il un moyen de l'écrire directement dans un fichier sur l'appareil? Ceci est mon classe pour obtenir les données:

public static SoapObject GetItemData() 
{ 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME_ITEM_DATA); 
    request.addProperty("Company", company); 
    request.addProperty("SerialNumber", serialId); 

    itemEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    itemEnvelope.dotNet = true; 

    itemEnvelope.setOutputSoapObject(request); 

    AndroidHttpTransportSE androidHttpTransport = new AndroidHttpTransportSE(URL); 
    androidHttpTransport.debug = true; 
    Log.d("==ITEM_URL==", URL); 
    try 
    { 
     androidHttpTransport.call(SOAP_ACTION_ITEM_DATA, itemEnvelope); 
     Log.d("==ItemVerbindung==", "Verbindung aufgebaut"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     Log.d("==ItemVerbindung==", "HTTPCALL nicht ausgeführt"); 
    } 

    try 
    { 
     itemResult = (SoapObject)itemEnvelope.getResponse(); 
     Log.d("==ItemResponse==", "PropertyCount: "+itemResult.getPropertyCount()); 
    } 
    catch(ClassCastException e) 
    { 
     itemResult = (SoapObject)itemEnvelope.bodyIn;   
    } 
    catch (SoapFault e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    if(itemResult != null) 
    { 
     return itemResult; 
    } 
    return null; 
} 

J'ai aussi coppied le HttpTransportSE.java et manipulé pour écrire directement dans un fichier. Mais là, je reçois une erreur Token non valide.

Répondre

0

Je me souviens avoir vu ce problème avant:

Deux Recommandations:

1) Enregistrez votre flux XML SOAP directement sur le disque que vous téléchargez. Ne le stockez pas en mémoire.

2) Parse à l'aide d'un analyseur SAX style , où vous ne chargez pas l'ensemble DOM en mémoire, mais plutôt l'analyser en morceaux.

EDIT: Cochez cette ->Very large SOAP response - Android- out of memory error

+0

Je l'ai déjà lu. Je sais que je dois le diffuser sur disque mais je ne sais pas comment. – Karas

+0

Lisez le lien de l'édition, il vous aidera –

+0

Je l'ai déjà lu. Je l'ai essayé de cette façon mais ensuite j'ai une exception de jeton inattendue. – Karas

0

J'ai trouvé une solution sans utiliser la bibliothèque KSoap2.

Voici le code:

try { 

    java.net.URL url = new java.net.URL(URL); 
    HttpURLConnection rc = (HttpURLConnection) url.openConnection(); 
    rc.setRequestMethod("POST"); 

    rc.setDoOutput(true); 
    rc.setDoInput(true); 

    rc.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); 
    rc.addRequestProperty("User-Agent", HTTP.USER_AGENT); 
    rc.setRequestProperty("SOAPAction", SOAP_ACTION_ITEM_DATA); 
    OutputStream out = rc.getOutputStream(); 
    Writer wout; 
    wout = new OutputStreamWriter(out); 
    wout.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
    wout.write("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"); 
    wout.write("<soap:Body>"); 
    wout.write("<GetItemData2 xmlns=\"http://localhost/HSWebBL\">"); 
    wout.write("<Company>" + company + "</Company>"); 
    wout.write("<SerialNumber>" + serialId + "</SerialNumber>"); 
    wout.write("</GetItemData2>"); 
    wout.write("</soap:Body>"); 
    wout.write("</soap:Envelope>"); 
    wout.flush(); 
    wout.close(); 
    rc.connect(); 

    Log.d("==CLIENT==", "responsecode: " + rc.getResponseCode() + " " + rc.getResponseMessage()); 
    InputStream in = new BufferedInputStream(rc.getInputStream(), BUFFER_SIZE); 
} catch (ProtocolException e) { 
    e.printStackTrace(); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

J'utilise un SAXParser pour analyser le InputStream. De cette façon, je ne reçois plus une exception outOfMemoryException et aucune erreur d'analyse.

+0

pouvez-vous s'il vous plaît poster votre code de comment avez-vous analysé le fichier ci-dessus.Je suis nouveau à l'analyse de ce type de réponse dans android. – joy