我試圖學習通過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
您將不得不顯示堆棧跟蹤,並清楚地顯示不起作用的代碼的不同之處。 – EJP
@EJP你對堆棧跟蹤是正確的,但我已經給出了教程(及其代碼)的鏈接。此外,錯誤在這個代碼中,所以你爲什麼需要這個區別? – KostasKol
[Java.net.SocketTimeoutException在Ksoap2]可能的重複(http://stackoverflow.com/questions/10043040/java-net-sockettimeoutexception-in-ksoap2) –