0

私はSOAP WebサービスとAsyncTaskを初めて使いました。私は、ログインにSOAP Webサービスを使用しているアプリケーションを開発しています。 onCreateメソッドですべての作業を実行しようとしましたが、アンドロイド.os.NetworkOnMainThreadExceptionが発生しました。AsyncTaskとSOAP webservices

私はAsyncTask、 を使用しようとしましたが、RetrieveFeedTaskクラスのemailTextおよびpasswordTextへの参照を取得できません。

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 


    private static String SOAP_ACTION = "intentionally hided"; 
    private static String NAMESPACE = "intentionally hided"; 
    private static String METHOD_NAME = "intentionally hided"; 
    private static String URL = "intentionally hided"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     final EditText emailText = (EditText) findViewById(R.id.emailText); 
     final EditText passwordText = (EditText) findViewById(R.id.passwordText); 
     Button loginButton = (Button) findViewById(R.id.button_login); 

     loginButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       new RetrieveFeedTask().execute(); 

      } 
     }); 
    } 

    class RetrieveFeedTask extends AsyncTask<String, String, String> { 



     protected String doInBackground(String... urls) { 


      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

      request.addProperty("userName", emailText.getText().toString()); 
      request.addProperty("userPassword", passwordText.getText().toString()); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

      envelope.setOutputSoapObject(request); 
      envelope.dotNet = true; 

      try { 
       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

       androidHttpTransport.call(SOAP_ACTION, envelope); 

       SoapObject result = (SoapObject) envelope.bodyIn; 
       if (result != null) { 
        Toast.makeText(getApplicationContext(), "Login Successful!", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), "Login Failed!", Toast.LENGTH_LONG).show(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
+0

をここの記事があるようです - > http://www.helloandroid.com/tutorials/using-ksoap2 -android-and-parsing-output-dataこれを行う方法を説明しています。しかし、可能ならば、私はjsonとSOAP Webservicesの代わりにAPIを調べます。 –

答えて

0

class RetrieveFeedTask extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 

     String result = ""; 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     request.addProperty("userName", emailText.getText().toString()); 
     request.addProperty("userPassword", passwordText.getText().toString()); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(request); 
     envelope.dotNet = true; 

     try { 
      HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 

      androidHttpTransport.call(SOAP_ACTION, envelope); 

      SoapObject result = (SoapObject) envelope.bodyIn; 
      if (result != null) { 
       result = "Login Successful!"; 
      } else { 
       result = "Login Failed!"; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected String onPostExecute(String result) { 
     super.onPostExecute(result); 

     if (result.equals("Login Successful!")) { 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), "Login Failed!", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

ありがとう、私はあなたのソリューションを試してみる前に解決策を得た、それは魅力的なように働いた。 –

3

あなたは非同期タスクのコンストラクタにビューのテキスト値を渡すと、内側の参照を経由してアクセスできます。

は、ここに私のコードです。

class RetrieveFeedTask extends AsyncTask<String, String, String> { 

    private String emailText, passwordText; 

    RetrieveFeedTask(String emailText, String passwordText) { 
     this.emailText = emailText; 
     this.passwordText = passwordText; 
    } 

    protected String doInBackground(String... urls) { 
     ... 
    } 
} 

あなたはそのようにのようにそれを呼び出します。

new RetrieveFeedTask(
     emailText.getText().toString(), 
     passwordText.getText().toString() 
).execute(); 

代わりに、配列としてdoInBackground()に直接パラメータを渡すことができます。

protected Void doInBackground(String... urls) { 
    String email = urls[0];  
    String password = urls[1]; 
    .... 
} 

そして、そのようにそれを呼び出す:

String[] urls = { 
    emailText.getText().toString(), 
    passwordText.getText().toString() 
}; 

new RetrieveFeedTask().execute(urls); 
+0

あなたの応答に感謝しました。私は同じことをしましたが、問題は "getTextメソッドはUIスレッドから呼び出さなければなりません"ということです。 –

+0

申し訳ありませんが、私はあなたの質問を誤解しました。私は私の答えを更新しました。非UIスレッドからビューの状態を変更することはできません。そのエラーが発生する理由は、doInBackground()がUI以外のスレッドで実行されるためです。 – 345

+0

ありがとう、それは問題を解決しましたが、私は何も返さないうちにdoInBackgroundメソッドから返された何かがあるはずです。 –

0

あなたが直接AsyncTaskにemailTextとpasswordTextを渡し、あなただけのいくつかのマイナーな変更を行う必要があります。あなたのonClickリスナで

ファースト:

文字列email = emailText.getText()。toString();

文字列パスワード= passwordText.getText()。toString();

new RetrieveFeedTask()。execute(email、password);あなたのAsyncTask doInBackgroundメソッドで

第二:

文字列電子メール=のURL [0];

文字列パスワード= urls [1];

AsyncTaskのexecuteメソッドにかなりの値を渡すことができます。これらの値は、doInBackgroundメソッドのパラメータとして受け取られます。あなたがこの(onPreExecuteとonPostExecuteと、しかしNetworkOnMainThreadExceptionなしAsyncTask)を使用することができ