假设你已经检查了所有这些步骤(出于某种原因,很多人都没有返回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.
亲爱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
好吧,昨天发布代码之前(我一直这样做),我测试了代码与4.0.3终端和2.2终端,并且相同的代码运行在更多的终端,并排除了与API的问题,但可能到您使用的是旧版本的ksoap。导致与其端点断开连接,我已经完成此测试的版本是: ksoap2-android-assembly-3.0.0-jar-RC.4 -with-dependencies.jar.Regards。 – RTOSkit
亲爱的RTOSKit,我解决了我的问题。你是对的。我必须在新线程中调用soap调用,然后再使用runOnUiThread()方法在UI线程上显示结果。谢谢你的努力,这对我很有帮助。 – user1937904