0

私の目的は、Android デバイスから .Net Web サービス (.asmx) を呼び出すことです。

.Net Webservice は、.net テスト クライアントと SOAPUI アプリケーションを使用してテストされます。

私はEclipseを使用してAndroidアプリケーションを構築しています.Webサービス呼び出し用のKSOAP2プロジェクトが含まれています。アプリケーションにはandroid.permission.INTERNET、ユーザー許可セクションにタグが含まれています。

私は2つの問題を抱えています
[1](以下のコード)からWebサービスメソッドを呼び出すと、アプリケーションは「android.os.NetworkOnMainThreadException」エラーをスローしますonCreate()(インターネットで見た例の多くは同じアプローチですが、私はしません私のプロジェクトで失敗する理由を知っている)

[2] 上記の問題を解決するために、「MainActivity」内にクラスを作成しましたが、「ソースが見つかりません」というメッセージが表示されますclient.execute("some text as input") (ビルド パスを確認しました。KSOAP2 jar ファイルへの参照があり、コンパイル エラーはありません)。

正しいアプローチと、この問題を解決する方法を教えてください。ご協力いただきありがとうございます

[問題1]のコード

    //This code for calling .net webservice from Android devide.. and throws "android.os.NetworkOnMainThreadException" whilst calling.

    package com.example.wsclient;

    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;

    import android.os.Bundle;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.view.Menu;
    import android.widget.TextView;

    public class MainActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            String SOAP_ACTION = "http://mycomp.org/GetParticipantVote";
            String METHOD_NAME = "GetParticipantVote";
            String NAMESPACE = "http://mycomp.org/";
            String URL = "http://10.0.2.2:8080/WSRating.asmx";

            try {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                request.addProperty("sID", "My_name");
                request.addProperty("sRate", "9");

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet=true;

                envelope.setOutputSoapObject(request);
                HttpTransportSE  androidHttpTransport = new HttpTransportSE (URL);
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject result=(SoapObject)envelope.getResponse();

                //To get the data.
                String resultData=result.getProperty(0).toString();

                AlertDialog alertDialog = new AlertDialog.Builder(this).create();
                alertDialog.setTitle("Webservice Client");
                alertDialog.setMessage("Webservice Resp : " +  resultData);
                alertDialog.show();

            }
            catch (Exception eE) {

                AlertDialog alertDialog1 = new AlertDialog.Builder(this).create();
                alertDialog1.setTitle("Webservice Client");
                alertDialog1.setMessage("Error : " +  eE.getMessage());
                alertDialog1.show();
           }
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }

[issue 2] のコード --

            package com.example.wsclient;

            import org.ksoap2.SoapEnvelope;
            import org.ksoap2.serialization.SoapObject;
            import org.ksoap2.serialization.SoapSerializationEnvelope;
            import org.ksoap2.transport.HttpTransportSE;

            import android.os.Bundle;
            import android.app.Activity;
            import android.app.AlertDialog;
            import android.view.Menu;
            import android.widget.TextView;

            public class MainActivity extends Activity {
                @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);

                    CallWS client = new CallWS();
                    client.execute("some text as input");

                }
                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    getMenuInflater().inflate(R.menu.activity_main, menu);
                    return true;
                }

                    /* AsyncTask class to remove android.os.NetworkOnMainThreadException error */
                    private class CallWS extends AsyncTask<String, Integer, String> {

                         protected String doInBackground(String... sValues) {

                                String resultData;

                                String SOAP_ACTION = "http://mycomp.org/GetParticipantVote";
                                String METHOD_NAME = "GetParticipantVote";
                                String NAMESPACE = "http://mycomp.org/";
                                String URL = "http://10.0.2.2:8080/WSRating.asmx";

                                try {
                                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                                    request.addProperty("sID", "My_name");
                                    request.addProperty("sRate", "9");

                                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                                    envelope.dotNet=true;

                                    envelope.setOutputSoapObject(request);
                                    HttpTransportSE  androidHttpTransport = new HttpTransportSE (URL);
                                    androidHttpTransport.call(SOAP_ACTION, envelope);
                                    SoapObject result=(SoapObject)envelope.getResponse();

                                    //To get the data.
                                    resultData =result.getProperty(0).toString();
                                }
                                catch (Exception eE) {
                                    resultData = "Error : " +  eE.getMessage();
                               }

                               return resultData
                         }

                         protected void onProgressUpdate(Integer... values) {

                         }

                         protected void onPostExecute(String result) {
                             // do something here to display the result...
                         }
                     }

                     }
4

3 に答える 3

0

メインスレッドでネットワーク操作を行うことはできません。チェックアウト
http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-12-19T05:08:31.037 に答える
0

私の推測では、このソリューションを ICS でテストしていると思われます。

簡単なテスト目的で Strick Mode を使用できます: http://developer.android.com/reference/android/os/StrictMode.html

ICS では、UI でのすべてのネットワーク アクションが禁止されているため、AsyncTasks を使用するように再構築する必要があります

于 2012-10-03T12:25:56.400 に答える
0

次のコードを使用してオーバーライドするだけです...

StrictMode.ThreadPolicy ポリシー = 新しい StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(ポリシー);

また、使用します...

于 2014-08-03T09:27:23.633 に答える