1

こんにちはスタックオーバーフローチーム、

奇妙なエラーが発生しました。ksop2 を使用して、http://www.webserviceX.NETへの SOAP 呼び出しを行います。Android 2.3.3でavmまたはスマートフォンを使用すると、次のコードが完全に機能します。バージョン 4 の Android スマートフォンでこのコードを実行すると、次のエラーが表示されます。

E/ActivityRecord(212): sendActivityPerformanceInfo 例外が発生しました: java.io.IOException: トランスポート エンドポイントが接続されていません

コードは次のとおりです。

  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);

httpTransportSE.call(..) でエラーが発生しました。

4

1 に答える 1

2

これらすべての手順を確認したと仮定します (そして、何らかの理由でそれらの多くが正しい例外名を返していません)。

  • アクティブな接続があります。
  • インターネット権限があります。
  • 2.x 端末で使用されるコードは、4.x 端末で使用されるコードと同じです。
  • 最近、soapUI などのアプリケーションまたは他の端末を使用して、サービス リンク タイプをテストしました。
  • コードが現在、他の端末で正しく実行されていることは確かです。

メインスレッドから接続を確立しようとしていると結論せざるを得ないため、API 11 (3.0) 以降に追加されたタイプNetworkOnMainThreadExceptionの例外が生成されます

これに対する解決策は、2 番目のスレッドから呼び出しを実行し、「オブザーバー」として何らかの戦略で結果を取得する必要があることです。

これは、この方法論を実装する場合のサンプル コードです。

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;

    }
}

このコードは、2.2 ~ 4.03 ターミナル
および ksoap2-android-assembly-3.0.0-jar-RC.4-with-dependencies.jar ライブラリでテストされています。

于 2012-12-31T01:41:08.467 に答える