我正在尝试从Android应用程序调用asmx Web服务。刚刚从字面上开始了一些Android开发。我一直在关注网上和这里发现的各种解决方案,看起来比预期的要困难。我尝试了各种解决方案,并且使用KSoap2似乎是实现这一目标的最简单方法,好吧,如果我能让它工作的话。
我有以下代码,直到某一点为止:
private class CallWebService extends AsyncTask<Void, Void, Void> {
private static final String SOAP_ACTION = "http://tempuri.org/GetUser";
private static final String METHOD_NAME = "GetUser";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://160.10.1.79:59315/Service1.asmx";
TextView tv;
@Override
protected Void doInBackground(Void... params) {
tv=(TextView)findViewById(R.id.txtMessage);
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
Object result = (Object)envelope.getResponse();
tv.setText(result.toString());
}
catch (Exception e) {
tv.setText(e.getMessage());
}
return null;
}
}
它似乎挂在了androidHttpTransport.call(SOAP_ACTION, envelope);
线上有什么想法?这是正确的方法吗?我应该朝另一个方向看吗?
答案 0 :(得分:1)
tv.setText(result.toString());
根本不建议从doInBackground
访问用户界面。
doInBackground
会自动将结果传递给onPostExecute
,您可以在那里设置文字
protected void onPostExecute(String result){
tv.setText(result.toString());
}
答案 1 :(得分:1)
好的,最终解决方案非常简单。 Web服务在localhost下运行,但使用localhost:59315
无效。所以我把它改为**MY IP**:59315
。仍然没有奏效。使用此问题Accessing localhost:port from Android emulator我尝试使用10.0.2.2:59315
并且它有效。所以,谢谢另一个问题的Akhil Jain。