2016-07-04 11 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にどのように投稿されるかだけです。

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

+0

スタックトレースを表示し、動作しないコードの違いを明確に示す必要があります。 – EJP

+0

@EJPあなたはスタックトレースについては正しいですが、私はチュートリアル(およびそのコード)へのリンクを与えました。また、エラーはこのコード内にあります。なぜ違いが必要でしょうか? – KostasKol

+0

可能性のある[Ksoap2のJava.net.SocketTimeoutException]の複製があります(http://stackoverflow.com/questions/10043040/java-net-sockettimeoutexception-in-ksoap2) –

答えて

0

を扱っているので、それを考え出しました。何らかの理由でファイルに <uses-permission android:name="android.permission.INTERNET"/>と入力していませんでした。ただし、作業中のプロジェクトの許可をコピーして貼り付けるだけで解決しました。 私はそれがアンドロイドスタジオのバグだと思っています。とにかく、ありがとうございました。

+0

これはAndroidスタジオのバグではありません。 *あなたは自分でmanifest.xmlに権限を追加する必要があります** Android Studioはそれを行う責任はありません.. !! –

+0

@jankigadhiya私はすでに を言ったように「何らかの理由でタイピングのための<使用許可アンドロイド:名=」android.permission.INTERNETあなた「/> AndroidManifest.xmlファイルに、それはしませんでした」 は、私が許可を追加しました、それをコピーして貼り付けるだけでした。 – KostasKol

関連する問題