0

KSoap2 を使用して WebService からデータを取得しようとしています。

WebService は非常に大きな XML ファイルに応答するため、HttpTransportSE.call() を実行しているときに ouOfMemory Exception が発生します。

Soap Webservice から断片化された応答を取得することは可能ですか? または、デバイス上のファイルに直接書き込む方法はありますか? これは、データを取得するための私のクラスです:

    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;
}

また、HttpTransportSE.java をコピーし、ファイルに直接書き込むように操作しました。しかし、無効なトークンエラーが発生します。

4

2 に答える 2

0

KSoap2 ライブラリを使用せずに解決策を見つけました。

コードは次のとおりです。

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();
}

SAXParser を使用して InputStream を解析します。そうすれば、outOfMemoryException が発生せず、解析エラーも発生しなくなります。

于 2012-11-15T14:20:40.540 に答える
0

以前にこの問題を見たことがあることを覚えています:

2 つの推奨事項:

1) ダウンロードした SOAP XML ストリームを直接ディスクに保存します。メモリに保存しないでください。

2) SAX スタイルのパーサーを使用して解析します。この場合、DOM 全体をメモリにロードするのではなく、チャンクで解析します。

編集:これを確認してください->非常に大きなSOAP応答-Android-メモリ不足エラー

于 2012-11-14T11:14:40.110 に答える