Метод HttpTransportSE .call() не имеет действия
Я пытаюсь создать приложение для Android, которое получает погоду на основе введенного вами почтового индекса, а также отображает время в формате EST и GMT. Я использую веб-сервисы (WSDL) и у меня написан код для доступа к нему, код приведен ниже:
public void sendMessage(View view)
{
SOAP_ACTION = "http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP";
NAMESPACE = "http://ws.cdyne.com/WeatherWS/";
METHOD_NAME = "GetCityWeatherByZIP";
URL = "http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl";
txtZIP = (EditText) findViewById(R.id.zipcode);
temp = (TextView) findViewById(R.id.displayTemp);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo property = new PropertyInfo();
{
property.name = "zipcode";
property.setNamespace(NAMESPACE);
property.type = PropertyInfo.STRING_CLASS;
property.setValue(txtZIP.getText().toString());
}
request.addProperty(property);
//request.addProperty("zipcode", txtZIP.getText().toString());
Toast.makeText(getApplicationContext(), "btnZIP pressed", Toast.LENGTH_LONG).show();
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.setOutputSoapObject(request);
envelope.implicitTypes = true;
envelope.dotNet = true;
HttpTransportSE androidHTTP = new HttpTransportSE(URL, 600);
try {
Toast.makeText(getApplicationContext(), "In try statement", Toast.LENGTH_LONG).show();
androidHTTP.call(SOAP_ACTION, envelope);
// SoapPrimitive resp = (SoapPrimitive) envelope.getResponse();
SoapObject result = (SoapObject) envelope.bodyIn;
if(result != null)
{
Toast.makeText(getApplicationContext(), "In IF statement", Toast.LENGTH_LONG).show();
//temp.append("in IF statement, result not null");
} else {
Toast.makeText(getApplicationContext(), "In ELSE statement", Toast.LENGTH_LONG).show();
//temp.append("in IF statement, result IS null");
}
} catch (HttpResponseException e) {
Toast.makeText(getApplicationContext(), "No Response", Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (XmlPullParserException e){
Toast.makeText(getApplicationContext(), "XML Pull exe", Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Теперь моя проблема в том, что с androidHTTP.call(SOAP_ACTION, envelope);
метод, ничего не происходит. У меня есть методы Toast, чтобы показать, что выполняется, и самое дальнее, что я получаю, находится в блоке try, но никогда в операторе if.
Я попытался осмотреться, чтобы увидеть, что может быть причиной и решением, но я не могу найти ничего для этой конкретной проблемы. Я увеличил время ожидания сервера до 600 и даже установил true для implicitType, но ничего не работает. Я знаю, что я использую SoapEnvelope.VER10 для этого метода, но у меня есть два других метода, где я использовал VER11 и VER12, и нет никаких изменений. Если у кого-то может быть представление о том, что может происходить, я буду очень признателен за помощь. Кроме того, AndroidManifest.xml имеет необходимую строку разрешений для доступа в Интернет.
1 ответ
!!!! РАБОТАЯ ПОДТВЕРЖДЕНА!!!
главный
public class MainActivity extends Activity{
public static String rslt,thread;
SoapMiddleMan c;
EditText txtZIP;
TextView weather;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtZIP = (EditText)findViewById(R.id.zipCode);
weather = (TextView)findViewById(R.id.weather);
}
public void sendMessage(View view)
{
try{
// condition for keeping the main thread asleep
thread = "START";
// create a new webservice caller thread
c = new SoapMiddleMan();
// join the new thread, start it and then select what webservice you want to access
c.join();c.setZip(txtZIP.getText().toString()); c.start();
// keep this thread asleep while the service thread is running
while(thread=="START")
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
rslt="Failed2";
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
weather.setText(rslt);
}
}
перекупщик
public class SoapMiddleMan extends Thread {
private String zip;
private SoapSenderClass cs;
public void run(){
try{
cs=new SoapSenderClass();
String resp=cs.getWeather(zip);
MainActivity.rslt=resp; //public string in calling activity
System.out.println("reached 2 \n");
}catch(Exception ex)
{
MainActivity.rslt=ex.toString();
}
MainActivity.thread = "done";
}
public void setZip(String searchZip)
{
zip = searchZip;
}
}
гость
public class SoapSenderClass{
String SOAP_ACTION = "http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP";
String NAMESPACE = "http://ws.cdyne.com/WeatherWS/";
String METHOD_NAME = "GetCityWeatherByZIP";
String URL = "http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl";
public String getWeather(String zipcode)
{
try{
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
PropertyInfo property = new PropertyInfo();
property.setName("ZIP");
property.setType(String.class);
property.setValue(zipcode);
request.addProperty(property);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject response = (SoapObject)envelope.getResponse();
String resultValue = response.toString();
return resultValue;
}
catch (Exception e) {
e.printStackTrace();
return "Failed to get ID";
}
}
}
Я упростил ваш код вызывающего абонента и изменил имя addproperty на ZIP, которое выглядит так, как будто вход вызывается в WSDL. Убрал скобки для вызовов свойств, удалил Namespace, которое не нужно, насколько я могу судить.