Android java.net.SocketTimeoutException
Android java.net.SocketTimeoutException
我正在尝试通过 java (android) 学习使用 SOAP。
我按照 this 教程创建了以下代码:
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());
}
}
}
每当我 运行 我得到 java.net.SocketTimeoutException 在 transport.call()
谷歌搜索并搜索 SO 并没有多大帮助。
我正在使用 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.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.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()
方法与示例(有效的方法)完全相同。
NOT 与 this SO question 重复,因为那个没有选择的答案,它解决了 java.net.SocketTimeoutException : Read Timeout
好的,明白了。由于某种原因打字
AndroidManifest.xml
文件中的 <uses-permission android:name="android.permission.INTERNET"/>
没有这样做。但是,从工作项目复制和粘贴权限,修复它。
我猜这是 android 工作室的错误。无论如何,谢谢你的帮助。
我正在尝试通过 java (android) 学习使用 SOAP。 我按照 this 教程创建了以下代码:
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());
}
}
}
每当我 运行 我得到 java.net.SocketTimeoutException 在 transport.call()
谷歌搜索并搜索 SO 并没有多大帮助。
我正在使用 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.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.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()
方法与示例(有效的方法)完全相同。
NOT 与 this SO question 重复,因为那个没有选择的答案,它解决了 java.net.SocketTimeoutException : Read Timeout
好的,明白了。由于某种原因打字
AndroidManifest.xml
文件中的 <uses-permission android:name="android.permission.INTERNET"/>
没有这样做。但是,从工作项目复制和粘贴权限,修复它。
我猜这是 android 工作室的错误。无论如何,谢谢你的帮助。