2012-12-30 29 views
1

你好stackoveflow团队,ksop2 java.io.IOException:传输端点未连接

我得到了一个奇怪的错误。我用ksop2拨打http://www.webserviceX.NET来拨打肥皂。当我在Android 2.3.3上使用avm或智能手机时,以下代码完美无缺。当我运行上有4个版本的Android智能手机这个代码,我收到此错误:

E/ActivityRecord(212):发生sendActivityPerformanceInfo异常:java.io.IOException异常:运输端点没有连接

这里的代码:在httpTransportSE.call发生

soapObject = new SoapObject(namespace, "GetCitiesByCountry"); 
    soapObject.addProperty("CountryName", countryIn); 
    envelope.setOutputSoapObject(soapObject); 
    envelope.bodyOut = soapObject; 
    envelope.dotNet = true; 
    httpTransportSE = new HttpTransportSE("http://www.webservicex.net/globalweather.asmx"); 
    httpTransportSE.debug = true; 
    Log.d(TAG, "********** http - Call ***********"); 
    httpTransportSE.call("http://www.webserviceX.NET/GetCitiesByCountry", envelope); 

错误(..) 也许你能帮助我。

回答

2

假设你已经检查了所有这些步骤(出于某种原因,很多人都没有返回corect异常名称)

  • 您有一个有效的连接。
  • 您拥有Internet权限。
  • 用于2.x终端的代码与4.x终端使用的代码相同。
  • 您最近使用soapUI或其他终端测试了应用程序的服务链接类型。
  • 您确定您的代码当前正在其他终端上正常运行。

我没有没有选择,只能得出这样的结论你正在试图建立从主线程的连接,从而产生自API 11(3.0)

此溶液中加入NetworkOnMainThreadException类型的异常你必须从第二个线程上运行您的来电,并以某种策略为“观察者”得到的结果

这是一个示例代码,如果你想实现这种方法

SOAP连接器类

public class SOAPConnector extends Observable { 

    private static boolean isRunAction=false; 

    private static String ACTION = ""; 
    private static String METHOD_NAME = ""; 
    private static String NAMESPACE = ""; 
    private static String URL_hprotocol = ""; 
    private static String URL_host = ""; 
    private static String URL_service = ""; 
    private static String outData = ""; 
    private static String inData = ""; 

    private final static int HTTPS_PORT = 443; 
    private final static int HTTPS_TIMEOUT = 5000; 

    private static boolean isHttps=false;  

    public SOAPConnector(String action, 
        String method, 
        String namespace, 
        String hprotocol, 
        String host, 
        String service){ 
     if(!isRunAction){ 
      ACTION = action; 
       METHOD_NAME = method; 
       NAMESPACE = namespace; 
       URL_hprotocol = hprotocol; 
       URL_host = host; 
      URL_service = service; 
     } 

    } 

    public void sendSoapData(String data,boolean https){ 
     if(!isRunAction){   
      isHttps = https;   
      outData = data;   
      Thread threadsoap = new Thread(runSendSoap); 
      threadsoap.start(); 
     } 
    } 


    private Runnable runSendSoap = new Runnable(){ 
     public void run(){ 
      launchSendSOAP(); 
      handlerSendSOAP.sendEmptyMessage(0); 
     } 
     private Handler handlerSendSOAP = new Handler() {    
      public void handleMessage(Message msg) {} 
     };   

    }; 

    private void launchSendSOAP(){ 
      isRunAction=true; 
      try { 
       SoapObject client = new SoapObject(NAMESPACE,METHOD_NAME);    
       SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
       String tmpDate = sdf.format(new Date(System.currentTimeMillis()));        
       String tmpData = outData;            
       client.addProperty("dataFIELD",(String)tmpData);     
       client.addProperty("dateFIELD",(String)tmpDate); 
       client.addProperty("codeFIELD","NULL");    
       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
       envelope.dotNet=false; 
       envelope.setOutputSoapObject(client);    
       if(isHttps){ 
        HttpsTransportSE androidHttpsTransport = new HttpsTransportSE(URL_host, HTTPS_PORT, URL_service,HTTPS_TIMEOUT); 
        androidHttpsTransport.call(ACTION,envelope); 
       }else{ 
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL_hprotocol+URL_host+URL_service); 
        androidHttpTransport.call(ACTION,envelope); 
       }     
       Object result = envelope.getResponse(); 
       inData=result.toString(); 
      } catch (Exception e) { 
       inData="ERROR"; 
      }   
      isRunAction=false; 
      setChanged(); 
      notifyObservers(inData); 

    } 
} 

活动呼叫

private SOAPConnector soapConnector = null; 
private ConnectorObserver conObserver =null; 
private boolean isActionSoap=false; 

private void setServiceObserver(){ 
    soapConnector = new SOAPConnector(SOAP_ACTION_dummy, 
             METHOD_NAME_dummy, 
             NAMESPACE_dummy, 
             URL_hprotocol, 
             URL_host, 
             URL_service);   
} 

private void soapSendProcess(){ 
    if(!isActionSoap){ 
     isActionSoap=true;   
     if(soapConnector==null){ 
      setServiceObserver(); 
     } 
     conObserver = new ConnectorObserver(); 
     soapConnector.deleteObservers();      
     soapConnector.addObserver((Observer)conObserver); 
     soapConnector.sendSoapData("TEST",false); 
    } 


public class ConnectorObserver implements Observer{ 
    @Override 
    public void update(Observable observable, Object data){ 
     String resultData = (String)data; 
     if(resultData.equals("ERROR")){ 
      //TODO fail action 
     }else{  
      //TODO parsing action 
     } 
     soapConnector.deleteObservers(); 
     isActionSoap=false; 

    } 
} 

This code has been tested with 2.2 ~ 4.03 Terminals
and with ksoap2-android-assembly-3.0.0-jar-RC.4-with-dependencies.jar library.

+0

亲爱RTOSKit,我查你的所有建议的步骤。我接受你的建议,并在新线程中发出SOAP调用。我用不同的硬件(S3,samsung tablet,Huwei Ascent)在Android 4上测试了我的代码并发生了错误。我已经测试了与Galaxy Ace和其他运行Android 2的手机相同的代码,它工作。好的,所以我已经设置了android 2.3(API Level 10)的avm,并测试了代码=>它的工作原理。然后我用android 4.2(API Level 17)设置了一个avm,并且我的程序崩溃了。我想强烈地说,问题是android版本。还有什么建议?最好的问候 – user1937904

+1

好吧,昨天发布代码之前(我一直这样做),我测试了代码与4.0.3终端和2.2终端,并且相同的代码运行在更多的终端,并排除了与API的问题,但可能到您使用的是旧版本的ksoap。导致与其端点断开连接,我已经完成此测试的版本是: ksoap2-android-assembly-3.0.0-jar-RC.4 -with-dependencies.jar.Regards。 – RTOSkit

+2

亲爱的RTOSKit,我解决了我的问题。你是对的。我必须在新线程中调用soap调用,然后再使用runOnUiThread()方法在UI线程上显示结果。谢谢你的努力,这对我很有帮助。 – user1937904

相关问题