2012-04-17 97 views
2

我正嘗試使用.net SOAP web服務和ksoap2 lib。來自http://www.vimeo.com/9633556的示例顯示瞭如何正確執行此操作。下面的例子中的代碼。一切都很順利!但我得到強制關閉錯誤!使用kso​​ap2 lib的SOAP web服務

這裏我的代碼:

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

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class SoapTest2Activity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView TV ; 
    TV=(TextView)findViewById(R.id.textView1); 
    TV.setText("Hi"); 

    String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
    String METHOD_NAME = "CelsiusToFahrenheit"; 
    String NAMESPACE = "http://tempuri.org/"; 
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; 

    System.setProperty("http.keepAlive", "false"); 

    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
    Request.addProperty("Celsius", "32"); 

    SoapSerializationEnvelope soapEnvelope = new      SoapSerializationEnvelope(SoapEnvelope.VER11); 
    soapEnvelope.dotNet = true; 
    soapEnvelope.setOutputSoapObject(Request); 

    HttpTransportSE httpTransport = new HttpTransportSE(URL); 
    try 
    { 
     httpTransport.call(SOAP_ACTION, soapEnvelope); 
     SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse(); 
     TV.setText(resultString.toString()); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    } 
    } 

請幫meeeeee

+1

發佈您的堆棧跟蹤 – njzk2 2012-04-17 15:37:42

回答

0
public String SOAP_ACTION; 
public String METHOD_NAME; 
public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; 
public final String SOAP_ADDRESS = "http://www.w3schools.com/webservices/tempconvert.asmx"; 
public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    input = (EditText) findViewById(R.id.editText1); 
    result = (EditText) findViewById(R.id.editText2); 

    cel= (RadioButton) findViewById(R.id.radioButton1); 
    fah= (RadioButton) findViewById(R.id.radioButton2); 

    rGroup = (RadioGroup) findViewById(R.id.rgTemp); 

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

    open.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      Intent openScreen = new Intent("com.loginworks.demo.ANDROIDPLOT"); 

      startActivity(openScreen); 
     } 
    }); 

    rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
     public void onCheckedChanged(RadioGroup rGroup, int checkedId) { 

     String in = input.getText().toString(); 

      if (cel.isChecked()) { 
       PROPERTY_NAME = "Fahrenheit"; 
       METHOD_NAME = "FahrenheitToCelsius"; 
       SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";     
      } 
      else { 
       PROPERTY_NAME = "Celsius"; 
       METHOD_NAME = "CelsiusToFahrenheit"; 
       SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
      } 

      Convert(in); 

     }    
    });   
} 

public void Convert(String val) { 
    SoapObject requestddr = new SoapObject(WSDL_TARGET_NAMESPACE, "Vrati"); 

    PropertyInfo pi=new PropertyInfo(); 

     pi.setName(PROPERTY_NAME); 
      pi.setValue(val); 
      pi.setType(String.class); 
      request.addProperty(pi); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 

     envelope.setOutputSoapObject(request); 

     HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 

     Object response= null; 

     try { 

     httpTransport.call(SOAP_ACTION, envelope); 
     response = envelope.getResponse(); 

      } 
     catch (Exception exception) { 

      response=exception;     
      } 

     result.setText(response.toString()); 

http://www.loginworks.com/technical-blogs/258-working-with-soap-web-service-through-android

2

你的代碼是正確的,但只能在安卓2.工作如果使用V4 ICS/JB你必須使用AsyncTask。

package com.example.wscall3; 

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

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 

public class MainActivity extends Activity { 
    private String TAG ="Vik"; 

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

     AsyncCallWS task = new AsyncCallWS(); 
     task.execute(); 
    } 

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... params) { 
      Log.i(TAG, "doInBackground"); 
      calculate(); 
      return null; 
     } 

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

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

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

    } 

    public void calculate() 
    { 
     String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit"; 
     String METHOD_NAME = "CelsiusToFahrenheit"; 
     String NAMESPACE = "http://tempuri.org/"; 
     String URL = "http://www.w3schools.com/webservices/tempconvert.asmx"; 

     try { 
      SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
      Request.addProperty("Celsius", "32"); 

      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      soapEnvelope.dotNet = true; 
      soapEnvelope.setOutputSoapObject(Request); 

      HttpTransportSE transport= new HttpTransportSE(URL); 

      transport.call(SOAP_ACTION, soapEnvelope); 
      SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse(); 

      Log.i(TAG, "Result Celsius: " + resultString); 
     } 
     catch(Exception ex) { 
      Log.e(TAG, "Error: " + ex.getMessage()); 
     } 

     SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius"; 
     METHOD_NAME = "FahrenheitToCelsius"; 
     try { 
      SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
      Request.addProperty("Fahrenheit", "100"); 

      SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      soapEnvelope.dotNet = true; 
      soapEnvelope.setOutputSoapObject(Request); 

      HttpTransportSE transport= new HttpTransportSE(URL); 

      transport.call(SOAP_ACTION, soapEnvelope); 
      SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse(); 

      Log.i(TAG, "Result Fahrenheit: " + resultString); 
     } 
     catch(Exception ex) { 
      Log.e(TAG, "Error: " + ex.getMessage()); 
     } 
    } 

} 

我的AndroidManifest.xml是:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.wscall3" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="7" 
     android:targetSdkVersion="16" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.wscall3.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
0

Connecting to the Network from developer.android.com

網絡操作可能涉及不可預測的延遲。爲了防止這種情況導致糟糕的用戶體驗,請始終在UI的單獨線程上執行網絡操作。 AsyncTask類提供了從UI線程中引發新任務的最簡單方法之一。

如果您不在獨立線程上執行網絡操作(如httpTransport.call(SOAP_ACTION, soapEnvelope);),則您將通過Android OS獲得強制關閉對話框。

您可以使用AsyncTask,ServiceIntentService來做到這一點。編寫另一個擴展其中一個類的Web服務調用類將解決您的問題。

相關問題