【问题标题】:Program Not Returning Any Value程序不返回任何值
【发布时间】:2012-06-11 17:23:58
【问题描述】:

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

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" />

【问题讨论】:

    标签: android web-services return


    【解决方案1】:

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

    而不是SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

    编辑: 这是我使用并完美运行的代码(我使用了Fragment,但您可以在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 方法中你可以更新你的视图...

    【讨论】:

    • 我按照你的建议进行操作,但它仍然不起作用..我点击按钮但没有得到任何回报..代码是否正确?因为我找不到任何错误!
    • 好吧,我尝试了代码并得到了具有良好数据的响应。也许你写错了。
    • 是的,当您将权重初始化为默认值时,代码可以正常工作。我试图在文本框中从用户那里获取值,然后转换它。如果不是,那就是问题返回值..我发布的代码仅用于相同目的!
    • 我刚刚编辑了代码,这样您就可以从 EditText 接收输入,但代码又可以正常工作了。
    • 只有一个错误'TestFragment 类型的 getView() 方法未定义'我该怎么办?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2021-06-14
      • 1970-01-01
      • 2015-05-20
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多