0

私はアンドロイドプログラミングが初めてです。このコードを書いて、Web サービスを介して kg をグラムに変換しました。プログラムはユーザーからの入力を受け取り、テキストボックスに値を返しますが、残念ながら値が返されません。助けてください。

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();

編集: これは私が使用して完全に機能したコードです(私は a を使用しましたが、 aFragmentで同じことを行うことができます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>

したがって、実行後のメソッドでビューを更新できます...

于 2012-06-11T17:35:08.827 に答える