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() 方法与示例(有效的方法)完全相同。

NOTthis SO question 重复,因为那个没有选择的答案,它解决了 java.net.SocketTimeoutException : Read Timeout

好的,明白了。由于某种原因打字 AndroidManifest.xml 文件中的 <uses-permission android:name="android.permission.INTERNET"/> 没有这样做。但是,从工作项目复制和粘贴权限,修复它。 我猜这是 android 工作室的错误。无论如何,谢谢你的帮助。