2016-05-02 9 views
1

こんにちは、アンドロイドからウェブサービスへの接続を試しています。これを行うためには、私が行っている手順は、次のとおりです。アンドロイドとウェブサービスの接続に失敗する

  1. は、無料のWebサービスを見つける:http://services.aonaware.com/DictService/DictService.asmx

  2. Androidのメーカーに

  3. 変更権限を持っているためにマニフェストファイルを、基本的なアクティビティを作成次の行を追加することにより、インターネットを使用する:

    は、Androidの許可使用します。name = "android.permission.INTERNETあなた"

  4. は、次のコードを使用してWebサービスを利用するためにksoap2ライブラリに

  5. てみてくださいを追加します。

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        tv = (TextView) findViewById(R.id.textView1); 
    
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        PropertyInfo property = new PropertyInfo(); 
        property.setName("word"); 
        //property.setType(String.class); 
        property.setValue("computer"); 
        request.addProperty(property); 
    
    
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request); 
    
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
        Object response = null; 
        try { 
         androidHttpTransport.getServiceConnection(); 
    
         try { 
          androidHttpTransport.call(SOAP_ACTION, envelope); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } catch (XmlPullParserException e) { 
          e.printStackTrace(); 
         } 
         tv.setText("success"); 
         response = envelope.getResponse(); 
         response.toString(); 
         String resultData= response.toString(); 
         tv.setText(resultData); 
    
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
    } 
    

declarationsしかし、textView1が結果を取得されていません。私のコードに何か問題はありますか?

注:私はGradleのバージョンここでは2.10

+1

あなたはAsyncTaskを使用する必要があります。 Googleは、人々がどのようにそれをやったのかを見出す。 – Techidiot

+0

@Bhush_Techidiot:ありがとう。あなたが正しいです! apparantly私はAsysnTaskを使用する必要があります。古いバージョンではAsyncTaskなしでOKだった。ただし、接続をテストする場合は、onCreateに次のコードを追加します。StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()。permitAll()。build(); StrictMode.setThreadPolicy(policy);
Job

+0

このディスカッションは本当に助けになりました:http://stackoverflow.com/questions/11969071/android-os-networkonmainthreadexception-for-webservice-ksoap – Job

答えて

1

Webサービスを実行するためにAsyncTaskを使用してみてください。ここにサンプルがあります - >android.os.NetworkOnMainThreadException for webservice (ksoap)

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

} 
0

でのAndroid Studioを使用 は、ASP.Net Webサービスのためのルーチンです:

SOAPオブジェクトを読む
public static SoapPrimitive callProcServiceForObject(String serviceMethod, String storedProc, String params) throws Exception { 
    String NAMESPACE = "http://YourWebServiceURL.com"; 
    String METHOD_NAME = getMethodName(serviceMethod); 
    String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
    String URL = "http://YourWebServiceURL.com"; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    request.addProperty("sPassword", YourPassword); 
    request.addProperty("sData", GlobalVars.serverDB); 
    request.addProperty("sSP_Name", storedProc); 
    request.addProperty("sParam", params); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

    // Enable the below property if consuming .Net service 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, timeout); 

    SoapObject returnable = null; 
    try { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     returnable = (SoapObject)envelope.getResponse(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new Exception("Msg:" + e.getMessage() + "; SP:" + storedProc + "; Params: " + params + "; Method:" + METHOD_NAME); 
    } 
    return returnable; 
} 

SoapPrimitive response = callProcServiceForObject(storedProcedureName, params); 
if (response != null) { 
    String sResponse = response.toString(); 
} 
+0

ありがとうございます。しかし、私はあなたのコードと私の本質の違いを見つけることができません。あなたは新しいコードを提案する以外の方法で私のコードを参照することはできますか?関連するWebサービスで自分のコードを自分で体験し、そのようにフィードバックを与えることができれば、本当に感謝しています。 – Job

関連する問題