2

KosapリクエストXMLを構築する方法は次のとおりです。

public static SoapSerializationEnvelope constructEnvelope (String METHOD_NAME, List<NameValuePair> properties) {
    SoapObject request = new SoapObject(Constants.NAMESPACE, METHOD_NAME);
    if (null != properties && !properties.isEmpty() && properties.size() > 0)   {
        for (NameValuePair prop : properties) {
            request.addProperty(prop.getName(), prop.getValue());
        }
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    if (null != properties && !properties.isEmpty() && properties.size() > 0)   {
        envelope.addMapping(Constants.NAMESPACE, METHOD_NAME, request.getClass());
    }
    return envelope;
}

スタックトレース :

04-08 16:46:42.292: WARN/System.err(19812): java.lang.NullPointerException
04-08 16:46:42.292: WARN/System.err(19812): at org.ksoap2.transport.ServiceConnectionSE.getResponseProperties(ServiceConnectionSE.java:85)
04-08 16:46:42.292: WARN/System.err(19812): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:189)
04-08 16:46:42.292: WARN/System.err(19812): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:114)
04-08 16:46:42.292: WARN/System.err(19812): at com.cantorfuturesexchange.CantorBinaryOptions.ui.LogInActivity$PracticeRegistration.doInBackground(LogInActivity.java:665)
04-08 16:46:42.292: WARN/System.err(19812): at com.cantorfuturesexchange.CantorBinaryOptions.ui.LogInActivity$PracticeRegistration.doInBackground(LogInActivity.java:623)
04-08 16:46:42.292: WARN/System.err(19812): at android.os.AsyncTask$2.call(AsyncTask.java:287)
04-08 16:46:42.292: WARN/System.err(19812): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-08 16:46:42.302: WARN/System.err(19812): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 16:46:42.302: WARN/System.err(19812): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
04-08 16:46:42.302: WARN/System.err(19812): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
04-08 16:46:42.302: WARN/System.err(19812): at java.lang.Thread.run(Thread.java:856)
04-08 16:46:42.342: ERROR/MP-Decision(1576): UP Ld:55 Nw:1.990000 Tw:140 rq:2.800000 seq:147.000000
04-08 16:46:42.793: ERROR/MP-Decision(1576): DOWN Ld:18 Ns:1.100000 Ts:190 rq:0.000000 seq:197.000000
04-08 16:46:43.574: WARN/PowerManagerService(718): Timer 0x7->0x3|0x0

研究努力 :

次のリンクで説明されているように、エンベロープの作成を変更することにより: HttpTransportSE.call メソッドが NullPointerException を頻繁に返す

public static SoapSerializationEnvelope constructEnvelope (String METHOD_NAME, List<NameValuePair> properties) {
    SoapObject request = new SoapObject(Constants.NAMESPACE, METHOD_NAME);
    if (null != properties && !properties.isEmpty() && properties.size() > 0)   {
        for (NameValuePair prop : properties) {
            PropertyInfo property = new PropertyInfo();
            {
                property.name = prop.getName();
                property.setNamespace(Constants.NAMESPACE);
                property.setValue(prop.getValue());
            }
            request.addProperty(property);
        }
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    if (null != properties && !properties.isEmpty() && properties.size() > 0)   {
        envelope.addMapping(Constants.NAMESPACE, METHOD_NAME, request.getClass());
    }
    return envelope;
}

バージョン 3.0.0-rc4 ではなく、Ksoap バージョン 3.0.0 を使用するなど、すべてを試した他のいくつかのリンクも見つけました。基本のチェックについて何かを述べているリンクも見つけましたが、問題を修正する方法を理解できません。以下はそのためのリンクです。

Android KSOAP2 ServiceConnectionSE NullPointerException

4

1 に答える 1

0

私はヌルポインタ例外について多くのことを検索しましたが、HTTPキープアライブを使用することを提案したものもあれば、Ksoap2に異なるバージョンを使用することを提案したものもありましたが、どれも役に立ちませんでした。だから私はソースをいじり始めました。簡単なハックで問題を解決しました。このハックは、私が行った最初の ksoap2 呼び出しでのみ null ポインター例外を取得していたため、私を助けてくれました。最初の呼び出しの後、すべての ksoap2 呼び出しが成功します。したがって、これを答えとして提案するつもりはありませんが、同じ問題に直面している場合は、ksoap2 ソースをダウンロードして、次のように HttpTransportSE の呼び出し関数を編集できます。

public List call(String soapAction, SoapEnvelope envelope, List headers)
        throws IOException, XmlPullParserException {
    return call(soapAction, envelope, headers, null);
}

public List callWithRetry(String soapAction, SoapEnvelope envelope, List headers, int numRetries)
        throws IOException, XmlPullParserException {
    for (int i=0; i<=numRetries; i++) {
        try {
            return call(soapAction, envelope, headers, null);
        } catch (IOException e) {
            if (i==numRetries) {
                throw e;
            }
        } catch (XmlPullParserException e) {
            if (i==numRetries) {
                throw e;
            }
        }
    }
    return null;
}

複数の試行が必要な場合に備えて、numOfRetries を追加しました。そして、ヌルポインター例外が発生した場合はいつでも callwithretry 関数を呼び出しました。すべてが魅力のように機能しました。注: ここでは、呼び出しが失敗した場合にサーバー要求を複数回行っています。いずれにせよ、古い呼び出し機能を使用したくない場合。

于 2013-10-02T20:06:02.420 に答える