SOAP Web サービスを使用するために、多くのプロジェクトで ksoap2-android ライブラリを使用してきました。なんで?私は代替手段を知らないからです(おそらく何もありません)。
私の問題?GPRS/EDGE ネットワークでの信頼性 (私が住んでいる場所では 3G/4G はありません)。
これが私が通常使用するコードです:
public String Login()
{
String status = "";
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
SOAP_LOGIN_METHOD);
request.addProperty("strUserName", Login.uName);
request.addProperty("strPassword", Login.pass);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
Log.d("Login Request: ", "" + request.toString());
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
try
{
httpTransport.call(SOAP_LOGIN_ACTION, envelope);
SoapObject response = (SoapObject) envelope.bodyIn;
status = response.getProperty("LoginResult").toString();
Log.d("Login Status: ", ""
+ response.getProperty("LoginResult").toString());
}
catch (Exception exception)
{
Log.d("Login Service Exception", exception.toString());
status = "-1";
}
return status;
}
Wi-Fi ネットワークでは、これはほとんど問題なく動作しますが、GPRS/EDGE 経由で同じことを試みると、ほとんどのサービス呼び出しで TIMEOUT または CONNECTION エラーが返されます。
問題の一部はネットワークにもあることはわかっていますが、たとえば、Viber の呼び出しは正常に機能していますが (あちこちで小さなパケットがドロップされます)、Web サービスが失敗することがあります。
私の質問?Android で GPRS ネットワークを介して SOAP サービスの信頼性を高める方法はありますか?
kSOAP2-android のドキュメントを見て、たとえば、HTTP リクエストが 1 回失敗し、使用できるものを返した場合に役立つ可能性があるかどうかを確認しましたが、ループ内で成功するまで試行を続けますが、戻り値の型はほとんど void です。