Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpTransportSE.call()方法没有任何操作_Java_Android_Http_Ksoap2 - Fatal编程技术网

Java HttpTransportSE.call()方法没有任何操作

Java HttpTransportSE.call()方法没有任何操作,java,android,http,ksoap2,Java,Android,Http,Ksoap2,我正在尝试制作一个Android应用程序,它可以根据你输入的zipcode获取天气信息,并且还可以用EST和GMT格式显示时间。我正在使用webservices(WSDLs)并编写了访问它的代码,代码如下: public void sendMessage(View view) { SOAP_ACTION = "http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP"; NAMESPACE = "http://ws.cdyne.com/W

我正在尝试制作一个Android应用程序,它可以根据你输入的zipcode获取天气信息,并且还可以用EST和GMT格式显示时间。我正在使用webservices(WSDLs)并编写了访问它的代码,代码如下:

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\u操作,信封)方法,没有发生任何事情。我有Toast方法来显示正在执行的内容,我得到的最远的结果是try块,但从来没有进入if语句


我试着环顾四周,看看可能的原因和解决方案,但我似乎找不到解决这个具体问题的任何方法。我已经将服务器的超时时间延长到600,甚至将implicitType设置为true,但没有任何效果。我知道我正在使用SoapEnvelope.VER10来实现这个方法,但我还有两个其他方法,其中我使用了VER11和VER12,没有任何变化。如果有人知道会发生什么事,我会非常感谢你的帮助。此外,AndroidManifest.xml具有访问internet所需的uses权限行。

!!!!工作确认

主要

中间人

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中调用的输入。删除了属性调用的方括号已删除命名空间,据我所知,该命名空间不需要。

尝试将androidHTTP.call更改为androidHttpTransport.callI尝试过,但不幸的是,这没有什么区别。您收到错误还是什么都没发生?也许日志中有一些信息?你是想直接从activity类运行它吗?我不认为android允许你启动一个新的线程并从他们的应用程序中运行soap请求。嘿,我知道现在可能没有任何用处,但是有一个叫做Async task的东西,你可能想查找它,它可以消除处理soap请求的额外类的需要,并将代码放在主类中,但仍然可以启动一个新的类线程:)哇,谢谢你这么说!我打算今晚晚些时候或者明天早上试试。但我想到的一件事是,我从其他人那里看到的教程以及同一个类中的其他人所做的,它们都是从同一个Java类中完成的。无论如何,我都要试试。再次感谢!我认为这取决于您使用的版本,因为我在activity类中执行了与之完全相同的步骤,然后将其拆分为一个线程;在肥皂剧中间人课上排队。正如我现在尝试的那样,Activity类中没有rslt,那么它到底是什么呢?应该用主活动的名称为lineReplace活动添加注释。主活动中的公共静态rslt将保存soap请求的结果,然后根据需要在主活动中使用rslt。
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";
}

}
}