こんにちは私は、サーバーから他のデータの中で画像を取得できることに依存するAndroidアプリに取り組んでいます。つまり、画像は応答の一部としてタグに含まれています。サーバーとの通信は、WCF と SOAP に基づいています。
画像を取得する必要がある時点までは、正常に機能していました。しかし、サーバーから画像を取得する必要がある場合、アプリは画像を含むサーバーからの応答を解析するときにかなりの時間がかかり、多くのメモリを消費します。私たちが扱っている画像は通常、1500 x 1000 ピクセルのサイズです。画像自体は、base64 でエンコードされたバイト配列として送信されます。
現在、DOM xml パーサーを使用して応答を解析しています。これは大量のメモリを消費する傾向があることがわかっていますが、これまでのところ、(画像の解析を除いて) 問題は発生していません。さらに、XMLPull (Android プラットフォームで推奨される XML パーサーと思われる) を使用したいくつかのマイナー テストでは、ほとんど同じ問題、巨大なメモリと時間の消費が解決されました。
この問題は、画像が文字列またはバイト配列に変換されていることが原因であると思われます。どちらも、画像のサイズを考慮すると、かなりの量のメモリを消費するはずです。
以下は、応答を解析するために現在使用しているコードの例です。
public static Document parseResponse(InputStream response)
{
Document parsedResponse = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
parsedResponse = builder.parse(response);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return parsedResponse;
}
そして、次のコードを使用して Async-Task を使用して応答を取得します。
protected Document doInBackground(ServerRequest... requests) {
ServerRequest request = requests[0];
HttpPost postRequest = request.postMethod;
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
HttpConnectionParams.setSoTimeout(httpParams, 10000);
DefaultHttpClient client = new DefaultHttpClient(httpParams);
HttpResponse response = null;
try {
response = client.execute(postRequest);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Document parsedResponse = null;
try {
InputStream stream = response.getEntity().getContent();
parsedResponse = ServerRequest.parseResponse(stream);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return parsedResponse;
}
現在、URL を使用して画像自体を取得することはできません。つまり、画像はサーバーから XML の一部として取得されます。それ以外の場合は、Android Hive のようなもの - 画像とテキストを含むカスタム ListView を使用することをお勧めします。
kSOAP2 のようなものを掘り下げる前に、上記のアプローチに簡単な修正があったかどうか、または簡単なものを見逃していないかどうかを調べたいと思います。