私は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にどのように投稿されるかだけです。
EDIT次のよう スタックトレースがある:
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()
方法は、例えば(作業1)と全く同じものです。
ませ重複this SO questionに1つが選ばれた答えを持っていないと、それは[OK]をjava.net.SocketTimeoutException : Read Timeout
スタックトレースを表示し、動作しないコードの違いを明確に示す必要があります。 – EJP
@EJPあなたはスタックトレースについては正しいですが、私はチュートリアル(およびそのコード)へのリンクを与えました。また、エラーはこのコード内にあります。なぜ違いが必要でしょうか? – KostasKol
可能性のある[Ksoap2のJava.net.SocketTimeoutException]の複製があります(http://stackoverflow.com/questions/10043040/java-net-sockettimeoutexception-in-ksoap2) –