سؤال

I'm trying to do a soap request according to this WSDL scheme:

http://pastebin.com/UT3t5XdQ

This is my app code:

private final String SOAP_ACTION = "https://t4t.services.telenet.be/TelemeterService";
    private final String NAMESPACE = "http://www.telenet.be/TelemeterService/";
    private final String METHOD_NAME = "RetrieveUsageRequestType";
    private final String URL = "https://t4t.services.telenet.be/TelemeterService.wsdl";

    private Button sendButton;
    private TextView responseView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendButton = (Button) findViewById(R.id.send);
        responseView = (TextView) findViewById(R.id.response);

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                //Parameters
                request.addProperty("UserId","test@telenet.be");
                request.addProperty("Password","test");

                //Version Soap
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                envelope.setOutputSoapObject(request);
                envelope.dotNet = true;

                try {
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                    //Call the webservice
                    androidHttpTransport.call(SOAP_ACTION, envelope);

                    // Get the result
                    SoapObject result = (SoapObject)envelope.bodyIn;

                    if(result != null)
                    {
                        Log.d("Debug","Result");
                        responseView.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

In my manifest I added the permission for the internet.

I'm getting this exception:

04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ android.os.NetworkOnMainThreadException
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:254)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:126)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:185)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at test.example.com.MainActivity$1.onClick(MainActivity.java:54)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.view.View.performClick(View.java:4438)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.view.View$PerformClick.run(View.java:18422)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5017)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-23 09:05:57.933    1454-1454/test.example.com W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
هل كانت مفيدة؟

المحلول 6

I solved the problem like Spring breaker suggested.

private Button sendButton;
private TextView responseView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sendButton = (Button) findViewById(R.id.send);
    responseView = (TextView) findViewById(R.id.response);

    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new SetTreasureBoxAsyncTask().execute();
        }

    });
}
private class SetTreasureBoxAsyncTask extends AsyncTask<String, String, String>
{
    SoapObject result = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... params) {



        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        //Parameters
        request.addProperty("UserId","test@telenet.be");
        request.addProperty("Password","test");

        //Version Soap
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(request);
        envelope.dotNet = true;

        try {
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            //Call the webservice
            androidHttpTransport.call(SOAP_ACTION, envelope);

            // Get the result
            result = (SoapObject)envelope.bodyIn;


        } catch (Exception e) {
            e.printStackTrace();
        }

        if(result != null)
            return result.toString();
        else
            return null;
    }

    @Override
    protected void onPostExecute(String res) {
        super.onPostExecute(res);
        if(result != null)
        {
            Log.d("Debug", "Result");
            responseView.setText(result.getProperty(0).toString());
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
        }
    }

}

The problem was the task took to long.

نصائح أخرى

This exception is thrown when an application attempts to perform a networking operation on its main thread. Run your code in AsyncTask:

private class SetTreasureBoxAsyncTask extends AsyncTask<String, String, String>
            {

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }
                @Override
                protected String doInBackground(String... params) {

                     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

                    //Parameters
                    request.addProperty("UserId","test@telenet.be");
                    request.addProperty("Password","test");

                    //Version Soap
                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                    envelope.setOutputSoapObject(request);
                    envelope.dotNet = true;

                    try {
                        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                        //Call the webservice
                        androidHttpTransport.call(SOAP_ACTION, envelope);

                        // Get the result
                        SoapObject result = (SoapObject)envelope.bodyIn;


                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return result.toString() ;
                }

                @Override
                protected void onPostExecute(String result) {
                    super.onPostExecute(result);                
                     if(result != null)
                    {
                        Log.d("Debug","Result");
                        responseView.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                    }
                }

            }

Execute the AsyncTask in the button click like following,

sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
  new SetTreasureBoxAsyncTask().execute(); 
});

Make Async class and put you soap request code in doinbackground() method. And execute you async class on button click event.

You can access network features from main thread. You need to start a foreign thread.

sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        new Thread(){

            @Override
                public void run() {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            //Parameters
            request.addProperty("UserId","test@telenet.be");
            request.addProperty("Password","test");

            //Version Soap
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.setOutputSoapObject(request);
            envelope.dotNet = true;

            try {
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                //Call the webservice
                androidHttpTransport.call(SOAP_ACTION, envelope);

                // Get the result
                SoapObject result = (SoapObject)envelope.bodyIn;

                if(result != null)
                {
                    Log.d("Debug","Result");
                    responseView.setText(result.getProperty(0).toString());
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        }}.start();
    });

Also You can use an AsyncTask.

You're not allowed to execute (potentially) long-running processes on the main thread. All network operations have to run in a separate background thread, because they would otherwise freeze the UI. Often this would make your app crash, because it's unresponsive while it's UI is frozen.

Check out Processes and Threads. You'll find that AsyncTask is very easy to use in various occasions.

Try this..

class SoapConnection extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... urls) {
        String values = "";
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            //Parameters
            request.addProperty("UserId","test@telenet.be");
            request.addProperty("Password","test");

            //Version Soap
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.setOutputSoapObject(request);
            envelope.dotNet = true;

            try {
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                //Call the webservice
                androidHttpTransport.call(SOAP_ACTION, envelope);

                // Get the result
                SoapObject result = (SoapObject)envelope.bodyIn;

                if(result != null)
                {
                    values = result.getProperty(0).toString();
                }
                else
                {
                    values = "No Response";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    protected void onPostExecute(String result) {
            if(result.equlas("No Response"))
                  Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
            else
                  responseView.setText(result);
    }
}

Call it like

sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                       new SoapConnection().execute();
            }
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top