0

SOAP から Web サービスに接続しようとしています。PHP で SOAP Web サービスを開発しましたが、正常に動作しています (Visual Studio で試しました)。

まず、これはエラーです:

09-27 06:28:07.724: E/AndroidRuntime(2057): Caused by: android.os.NetworkOnMainThreadException
09-27 06:28:07.724: E/AndroidRuntime(2057):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.io.IoBridge.connectErrno(IoBridge.java:144)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.io.IoBridge.connect(IoBridge.java:112)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at java.net.Socket.connect(Socket.java:842)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:126)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:179)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:116)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:111)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at com.example.FirstExample.CategoriesActivity.onCreate(CategoriesActivity.java:49)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at android.app.Activity.performCreate(Activity.java:5133)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
09-27 06:28:07.724: E/AndroidRuntime(2057):     ... 11 more

ここで表示できる完全なエラー: http://pastebin.com/cRQ66vrj

そして、これはJavaでの私のコードです:

private final String NAMESPACE = "http://10.0.0.20/soap/test_wsdl";
private final String URL = "http://10.0.0.20/info_send/encode.php?wsdl";
private final String SOAP_ACTION = "http://10.0.0.20/info_send/encode.php/select_data";
private final String METHOD_NAME = "select_data";
private String Webresponse = "";

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response;
            response = (SoapPrimitive)envelope.getResponse();
            Webresponse = response.toString();
        } catch (SoapFault e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }

        Log.e("VALUE: ", Webresponse);

私はいくつかのチュートリアルに従ってきましたが、どれも私のニーズに適合していません。だから私は自分がやりたいことをするメソッドを作成しようとしています。また、マニフェストに追加しました:

<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>

私は何を間違っていますか?また、上記のコードで取得した値をアイテムごとに取得できるように、方向性を教えていただければ幸いです。何かのようなもの:

for(int i = 0; i <= variable.size; i++){
   Log.e("Value: ", variable[i].ToString())
}

ありがとう。

4

3 に答える 3

1

まず第一に、例外はコードの何が問題なのかを明確に示しています

Caused by: android.os.NetworkOnMainThreadException

メイン スレッドで長時間実行されるネットワーク操作を実行することはできません。少なくとも最後のメソッド呼び出しを非同期メソッドに移動します。次のように実行できます。

ExecutorService mExec = Executors.newSingleThreadExecutor();

    mExec.execute(new Runnable() {          
                @Override
                public void run() {             
                    try{
        androidHttpTransport.call(SOAP_ACTION, envelope);
                    }catch(Exception exc){
                        exc.printStackTrace();
                    }
                }
            });

ksoap2 を Web サービス androidHttpTransport.setXmlVersionTag(K.STR_XML_VERSION); で動作させるには、この行を追加する必要がありました。

また、次の SOAP エンベロープ プロパティを設定しました

        envelope.encodingStyle = SoapEnvelope.ENV;
        envelope.setAddAdornments(false);
        envelope.implicitTypes = false;
于 2013-09-27T11:06:54.497 に答える
1

AsyncTask を使用してネットワーク関連の操作を行います...

以下は別の解決策です。コードに以下の行を追加するだけです。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
于 2013-09-27T11:10:16.483 に答える
1

ログから

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)

AsyncTaskSOAP リクエストが in (または in Service) で実行されることを確認してください 。

メイン スレッド (別名アクティビティ) で実行すると、上記のエラーが発生する可能性があります。

ここで見つけることができる AsyncTask に関する情報

そしてここにいくつかの例

于 2013-09-27T10:46:36.537 に答える