2 Stimmen

Aufrufen des Webdienstes von der Android-App scheint zu hängen.

Ich versuche, einen asmx-Webservice von einer Android-App aus aufzurufen. Ich habe heute gerade mit der Android-Entwicklung angefangen. Ich bin verschiedenen Lösungen gefolgt, die ich im Netz und hier gefunden habe, und es scheint schwieriger zu sein als erwartet. Ich habe verschiedene Lösungen ausprobiert und es scheint, dass die Verwendung von KSoap2 der einfachste Weg ist, um dies umzusetzen, nun ja, wenn ich es zum Laufen bringen könnte.

Ich habe den folgenden Code, der bis zu einem bestimmten Punkt funktioniert:

private class CallWebService extends AsyncTask {

    private static final String SOAP_ACTION = "http://tempuri.org/GetUser";
    private static final String METHOD_NAME = "GetUser";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://160.10.1.79:59315/Service1.asmx";
    TextView tv;

    @Override
    protected Void doInBackground(Void... params) {
        tv=(TextView)findViewById(R.id.txtMessage);

        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet=true;
            envelope.setOutputSoapObject(request);

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            androidHttpTransport.call(SOAP_ACTION, envelope);

            Object result = (Object)envelope.getResponse();

            tv.setText(result.toString());
        }
        catch (Exception e) {
            tv.setText(e.getMessage());
        }
        return null;
    }
}

Es scheint bei der Zeile androidHttpTransport.call(SOAP_ACTION, envelope); zu hängen. Irgendwelche Ideen warum? Ist dies der richtige Ansatz? Sollte ich in eine andere Richtung schauen?

1voto

Robin Chander Punkte 7065
 tv.setText(result.toString());

Es wird absolut nicht empfohlen, auf die UI von doInBackground zuzugreifen.

doInBackground wird das Ergebnis automatisch an onPostExecute übergeben und Sie können den Text dort setzen.

protected void onPostExecute(String result){
   tv.setText(result.toString());
}

1voto

anothershrubery Punkte 19699

Am Ende war die Lösung für das Problem recht einfach. Der Webservice lief unter localhost, funktionierte jedoch nicht mit localhost:59315. Deshalb habe ich es geändert zu **MEINE IP**:59315. Es hat immer noch nicht funktioniert. Nachdem ich diese Frage angesehen habe Zugriff auf localhost:port vom Android-Emulator habe ich versucht, 10.0.2.2:59315 zu verwenden, und es hat funktioniert. Daher danke an Akhil Jain in der anderen Frage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X