1

石鹸の解析を試みていますが、うまくいきません。私のアプリケーションでは、1 つの edittext、1 つのボタン、1 つの textview を使用しています。アプリケーションを実行すると、出力ウィンドウが表示されます。しかし、edittextに値を入力してボタンをクリックすると、エラーが発生します。解決方法を知りません。どなたか助けていただけませんか。私の MainActivity は以下のとおりです。

public class MainActivity extends Activity {    
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
private final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
private final String METHOD_NAME = "CelsiusToFahrenheit";
private String TAG = "Sakthi";
private static String celcius;
private static String fahren;
Button b;
TextView tv;
EditText et;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     //Celcius Edit Control
    et = (EditText) findViewById(R.id.editText1);
    //Fahrenheit Text control
    tv = (TextView) findViewById(R.id.tv_result);
    //Button to trigger web service invocation
    b = (Button) findViewById(R.id.button1);
    //Button Click Listener
    b.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            //Check if Celcius text control is not empty
            if (et.getText().length() != 0 && et.getText().toString() != "") {
                //Get the text control value
                celcius = et.getText().toString();
                //Create instance for AsyncCallWS
                AsyncCallWS task = new AsyncCallWS();
                //Call execute 
                task.execute();
            //If text control is empty
            } else {
                tv.setText("Please enter Celcius"); 
            }
        }
    });
}
public class AsyncCallWS extends AsyncTask<String, Void, integer> {
    @Override
    protected integer doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        getFahrenheit(celcius);
        return null;
    }

    public void getFahrenheit(String celsius) {
        //Create request
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        //Property which holds input parameters
        PropertyInfo celsiusPI = new PropertyInfo();
        //Set Name
        celsiusPI.setName("Celsius");
        //Set Value
        celsiusPI.setValue(celsius);
        //Set dataType
        celsiusPI.setType(double.class);
        //Add the property to request object
        request.addProperty(celsiusPI);
        //Create envelope
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        //Set output SOAP object
        envelope.setOutputSoapObject(request);
        //Create HTTP call object
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try {
            //Invole web service
            androidHttpTransport.call(SOAP_ACTION, envelope);
            //Get the response
            SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
            //Assign it to fahren static variable
            fahren = response.toString();

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

    @Override
    protected void onPostExecute(integer result) {
        Log.i(TAG, "onPostExecute");
        tv.setText(fahren + "° F");
    } 

    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
        tv.setText("Calculating...");
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Log.i(TAG, "onProgressUpdate");
    }

}'

logcatのエラーはこのようなものです

'**06-19 07:20:22.613: E/AndroidRuntime(1525): FATAL EXCEPTION: AsyncTask #1
06-19 07:20:22.613: E/AndroidRuntime(1525): java.lang.RuntimeException: An error occured while executing doInBackground()
06-19 07:20:22.613: E/AndroidRuntime(1525):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.lang.Thread.run(Thread.java:856)
06-19 07:20:22.613: E/AndroidRuntime(1525): Caused by: java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject
06-19 07:20:22.613: E/AndroidRuntime(1525):     at com.example.medimixsoap.MainActivity$AsyncCallWS.getFahrenheit(MainActivity.java:74)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at com.example.medimixsoap.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:68)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at com.example.medimixsoap.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:1)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-19 07:20:22.613: E/AndroidRuntime(1525):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-19 07:20:22.613: E/AndroidRuntime(1525):     ... 4 more**'
4

2 に答える 2

0

それ以外の:

AsyncCallWS task = new AsyncCallWS();
//Call execute 
task.execute();

これを入れてみてください:

AsyncCallWS threadsStart = new AsyncCallWS();
threadsStart.execute(celcius);

try {
  farenheit = threadsStart.get();
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
}

次に、代わりに AsyncCallWS クラスで:

@Override
protected integer doInBackground(String... params) {
    Log.i(TAG, "doInBackground");
    getFahrenheit(celcius);
    return null;
}

これを入れてみてください:

@Override
protected integer doInBackground(String... params) {
    Log.i(TAG, "doInBackground");
    getFahrenheit(params);
    return null;
}

問題は、バックグラウンド タスクが完了するのを待っていないことにあると思います。

于 2013-06-19T07:46:47.683 に答える
0

Soap オブジェクトに外部ライブラリを使用していますか? ライブラリが最終的な apk に含まれていることを確認します: [プロジェクト プロパティ] -> [Java ビルド パス] -> [タブ オーダーとエクスポート] で、[Android プライベート ライブラリ] がチェックされていることを確認します。

于 2013-06-19T07:45:30.660 に答える