2016-07-04 44 views
-2

我試圖學習通過Java(android)使用SOAP。 我跟着this教程中,我已經創建了下面的代碼:Android java.net.SocketTimeoutException

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 


public class MainActivity extends AppCompatActivity { 

    String TAG = "Response"; 
    String value; 
    Button btn; 
    EditText val; 
    TextView fahr; 
    TextView cels; 

    SoapPrimitive result; 



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

     btn = (Button) findViewById(R.id.convert_btn); 
     val = (EditText) findViewById(R.id.value); 
     fahr = (TextView) findViewById(R.id.f); 
     cels = (TextView) findViewById(R.id.c); 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick (View view) { 
       value = val.getText().toString(); 
       AsyncCallWS ac = new AsyncCallWS(); 
       ac.execute(); 
      } 
     }); 
    } 

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      Log.i(TAG, "onPreExecute"); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      Log.i(TAG, "doInBackground"); 
      calculate(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.i(TAG, "onPostExecute"); 
      if (result != null) { 
       cels.setText(result.toString()); 
      } 
     } 
    } 


    public void calculate() { 
     String SOAP_ACTION = "http://www.w3schools.com/xml/FahrenheitToCelsius"; 
     String METHOD_NAME = "FahrenheitToCelsius"; 
     String NAMESPACE = "http://www.w3schools.com/xml/"; 
     String URL = "http://www.w3schools.com/xml/tempconvert.asmx"; 

     try { 
      SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
      Request.addProperty("Fahrenheit", 15); 

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

      HttpTransportSE transport = new HttpTransportSE(URL); 

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

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

每當我運行它,我在transport.call() 得到java.net.SocketTimeoutException谷歌搜索,並通過搜索所以沒有多大幫助。 我使用的是www.w3schools.com網絡服務,URL通過我的瀏覽器完美加載。

注意: 如果我複製並粘貼示例中的代碼,它將按預期工作。但是,如果我手工編寫代碼(大多數情況下是相同的),則會拋出此異常。我從教程中改變的唯一事情就是結果將如何在UI上發佈。

編輯: 堆棧跟蹤如下:

java.net.SocketTimeoutException 
07-05 06:51:16.094 2734-2777/com.kostas.tade W/System.err:  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:130) 
07-05 06:51:16.094 2734-2777/com.kostas.tade W/System.err:  at com.kostas.tade.MainActivity.calculate(MainActivity.java:90) 
07-05 06:51:16.094 2734-2777/com.kostas.tade W/System.err:  at com.kostas.tade.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:60) 
07-05 06:51:16.098 2734-2777/com.kostas.tade W/System.err:  at com.kostas.tade.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:51) 
07-05 06:51:16.107 2734-2777/com.kostas.tade W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
07-05 06:51:16.107 2734-2777/com.kostas.tade W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
07-05 06:51:16.110 2734-2777/com.kostas.tade W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
07-05 06:51:16.110 2734-2777/com.kostas.tade W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
07-05 06:51:16.110 2734-2777/com.kostas.tade W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
07-05 06:51:16.110 2734-2777/com.kostas.tade W/System.err:  at java.lang.Thread.run(Thread.java:818) 

而且實際calculate()方法是完全一樣的一個作爲例子(一個工作)。

重複,以this SO question,因爲一個不具有選擇的答案,它解決了java.net.SocketTimeoutException : Read Timeout

+0

您將不得不顯示堆棧跟蹤,並清楚地顯示不起作用的代碼的不同之處。 – EJP

+0

@EJP你對堆棧跟蹤是正確的,但我已經給出了教程(及其代碼)的鏈接。此外,錯誤在這個代碼中,所以你爲什麼需要這個區別? – KostasKol

+0

[Java.net.SocketTimeoutException在Ksoap2]可能的重複(http://stackoverflow.com/questions/10043040/java-net-sockettimeoutexception-in-ksoap2) –

回答

0

好了,想通了。出於某種原因,在AndroidManifest.xml文件中輸入 <uses-permission android:name="android.permission.INTERNET"/>沒有這樣做。但是,從工作項目複製並粘貼權限,修復它。 我猜這是android studio的一個bug。無論如何,謝謝你的幫助。

+0

它是**沒有任何bug的Android工作室** * *您需要自己在manifest.xml中添加權限** Android Studio不對此負責.. !! –

+0

@jankigadhiya正如我已經說過 「出於某種原因TYPING <使用權限android:name =」android.permission.INTERNET「/>在AndroidManifest.xml文件中沒有這樣做」 我沒有添加權限,但只有複製和粘貼它的工作。 – KostasKol

相關問題