0

我是android编程的新手。刚刚编写了这段代码,通过网络服务将公斤转换为克。该程序从用户那里获取输入并在文本框中返回值,但遗憾的是我没有得到任何值。请帮忙。

package com.example.Passing;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;


public class PassingActivity extends Activity
{
private final String NAMESPACE = "http://www.webserviceX.NET/";
private final String URL = "http://www.webservicex.net/ConvertWeight.asmx";
private final String SOAP_ACTION = "http://www.webserviceX.NET/ConvertWeight";
private final String METHOD_NAME = "ConvertWeight";

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

Button   mButton;
EditText mEdit;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mButton = (Button)findViewById(R.id.button);
    mEdit   = (EditText)findViewById(R.id.editText);

    mButton.setOnClickListener(

            new View.OnClickListener()
            {

                public void onClick(View view)
                {
                    String weight = mEdit.getText().toString();

                    String fromUnit = "Kilograms";
                    String toUnit = "Grams";

                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 


                    PropertyInfo weightProp =new PropertyInfo();
                    weightProp.setName("Weight");
                    weightProp.setValue(weight);
                    weightProp.setType(double.class);
                    request.addProperty(weightProp);            

                    PropertyInfo fromProp =new PropertyInfo();
                    fromProp.setName("FromUnit");
                    fromProp.setValue(fromUnit);
                    fromProp.setType(String.class);
                    request.addProperty(fromProp);

                    PropertyInfo toProp =new PropertyInfo();
                    toProp.setName("ToUnit");
                    toProp.setValue(toUnit);
                    toProp.setType(String.class);
                    request.addProperty(toProp);


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

                    try 
                    {
                        androidHttpTransport.call(SOAP_ACTION, envelope);
                        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
                        Log.i("myApp", response.toString());

                        EditText et = (EditText)findViewById(R.id.my_edit);
                        et.setText("equal"+response.toString());


                        /*  TextView tv = new TextView(this);
                        tv.setText(weight+" "+fromUnit+" equal "+response.toString()+ " "+toUnit);
                        setContentView(tv);*/

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

main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="number" >

    <requestFocus />
</EditText>

<EditText 
    android:layout_margin="20dip"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minLines="15"
    android:maxLines="15"
    android:textSize="12sp"
    android:editable="false"
    android:id="@+id/my_edit"/>


<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Convert" />

4

2 回答 2

0

我不熟悉您正在使用的 kSoap 库。但是,您正在调用需要一些时间来处理的 Web 服务,然后尝试立即获取返回值。这看起来有问题。这通常的工作方式是您调用 Web 服务,然后一旦您的服务返回您的数据,就会执行一些回调。

于 2012-06-11T17:29:26.007 回答
0

SoapPrimitive 并不总是能正常工作。尝试更改获得此类响应的方式:SoapObject result_xml = (SoapObject) envelope.bodyIn;

代替SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

编辑: 这是我使用并完美运行的代码(我使用了 aFragment但你可以在 an 中做同样的事情Activity)但请记住,任何长度操作(如互联网,因为它们可能导致网络超时或延迟超过 5 秒)必须如果您不想像著名的 ANR 那样产生不需要的副作用,请在线程中完成。

    public class TestFragment extends Fragment implements OnClickListener{

    private final String NAMESPACE = "http://www.webserviceX.NET/";
    private final String URL = "http://www.webservicex.net/ConvertWeight.asmx";
    private final String SOAP_ACTION = "http://www.webserviceX.NET/ConvertWeight";
    private final String METHOD_NAME = "ConvertWeight";

    private EditText textToConvert;
    private String weight;
    private Button send;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        final View view = getView();
        textToConvert = (EditText) view.findViewById(R.id.ammount);
        send = (Button) view.findViewById(R.id.button);
        send.setOnClickListener(this);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate( R.layout.main, container, false );
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button:
            weight = textToConvert.getText().toString();
            new AsyncSendData().execute();
            break;
        default:
            break;
        }
    }


    public class AsyncSendData extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            String fromUnit = "Kilograms";
            String toUnit = "Grams";

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
            PropertyInfo weightProp =new PropertyInfo();
            weightProp.setName("Weight");
            weightProp.setValue(weight);
            weightProp.setType(double.class);
            request.addProperty(weightProp);            

            PropertyInfo fromProp =new PropertyInfo();
            fromProp.setName("FromUnit");
            fromProp.setValue(fromUnit);
            fromProp.setType(String.class);
            request.addProperty(fromProp);

            PropertyInfo toProp =new PropertyInfo();
            toProp.setName("ToUnit");
            toProp.setValue(toUnit);
            toProp.setType(String.class);
            request.addProperty(toProp);

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

            try 
            {
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject result_xml = (SoapObject) envelope.bodyIn;
                Log.e("myApp", result_xml.toString());
            } 
            catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
    }

}

这是我使用的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="From" />

    <EditText
        android:id="@+id/ammount"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" 
        android:inputType="number">
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

所以在 post execute 方法中,您可以更新您的视图...

于 2012-06-11T17:35:08.827 回答