1

我正在尝试使用 android 应用程序调用 Web 服务。所有网络操作都在扩展 AsyncTask 类的单独类中完成。

package com.webservicedemo1;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class WebServiceDemoActivity extends Activity

{
/** Called when the activity is first created. */

private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
private static String SOAP_ACTION2 = "http://tempuri.org/CelsiusToFahrenheit";
private static String NAMESPACE = "http://tempuri.org/";
private static String METHOD_NAME1 = "FahrenheitToCelsius";
private static String METHOD_NAME2 = "CelsiusToFahrenheit";
private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";

Button btnFar, btnCel, btnClear;

EditText txtFar, txtCel;

@Override
public void onCreate(Bundle savedInstanceState)

{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_web_service_demo);

    btnFar = (Button) findViewById(R.id.button1);

    btnCel = (Button) findViewById(R.id.button2);

    btnClear = (Button) findViewById(R.id.button3);

    txtFar = (EditText) findViewById(R.id.editText1);

    txtCel = (EditText) findViewById(R.id.editText2);

    btnFar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v)

        {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);
            request.addProperty("Fahrenheit", txtFar.getText().toString());
            BackGround bg = new BackGround();
            bg.execute(request);
            //request.getP
        }

    });

    btnCel.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v) {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);
            request.addProperty("Celsius", txtCel.getText().toString());
            BackGround bg = new BackGround();
            bg.execute(request);

        }

    });

    btnClear.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v)

        {
            txtCel.setText("");
            txtFar.setText("");

        }

    });

}

private class BackGround extends AsyncTask<SoapObject, Object, SoapObject> {
    SoapObject result = null;

    @Override
    protected SoapObject doInBackground(SoapObject... req) {
        // TODO Auto-generated method stub
        // Initialize soap request + add parameters

        // Declare the version of the SOAP request
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.setOutputSoapObject(req);

        envelope.dotNet = true;

        try {


            PropertyInfo pi = new PropertyInfo();

            req[0].getPropertyInfo(0, pi);
            String type=pi.getName();


            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            if(type.equals("Fahrenheit")){
            // this is the actual part that will call the webservice
            androidHttpTransport.call(SOAP_ACTION1, envelope);
            }
            else if(type.equals("Celsius")){
                androidHttpTransport.call(SOAP_ACTION2, envelope);
            }
            // Get the SoapResult from the envelope body.
            result = (SoapObject) envelope.bodyIn;


        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return result;

    }

    @Override
    protected void onPostExecute(SoapObject res) {
        // TODO Auto-generated method stub
        super.onPostExecute(res);
        if (res != null) {

            // Get the first property and change the label text
            txtFar.setText(res.getProperty(0).toString());

        }

        else {

            Toast.makeText(getApplicationContext(), "No Response",
                    Toast.LENGTH_LONG).show();

        }
    }

}

}

但我收到以下错误。

08-27 17:48:42.980: W/System.err(1014): java.lang.RuntimeException: Cannot serialize:      [Lorg.ksoap2.serialization.SoapObject;@412102b0
08-27 17:48:42.980: W/System.err(1014):     at   org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:708)
08-27 17:48:42.980: W/System.err(1014):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:618)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:198)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.Transport.createRequestData(Transport.java:111)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:119)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
08-27 17:48:42.990: W/System.err(1014):     at com.webservicedemo1.WebServiceDemoActivity$BackGround.doInBackground(WebServiceDemoActivity.java:128)
08-27 17:48:42.990: W/System.err(1014):     at com.webservicedemo1.WebServiceDemoActivity$BackGround.doInBackground(WebServiceDemoActivity.java:1)
08-27 17:48:43.000: W/System.err(1014):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-27 17:48:43.000: W/System.err(1014):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-27 17:48:43.000: W/System.err(1014):     at >java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-27 17:48:43.000: W/System.err(1014):     at java.lang.Thread.run(Thread.java:856)

无法找出为什么会发生这种情况。我的代码有什么问题?

4

1 回答 1

1

我想您需要更改一行代码

envelope.setOutputSoapObject(req);

envelope.setOutputSoapObject(req[0]);

阅读有关 AsyncTask的更多信息:开发人员站点

于 2012-09-05T06:43:15.960 回答