私の目的は、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...
}
}
}