Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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/229.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 Android上的KSoap2冻结设备,而不是进行Web服务调用_Java_Android_Ksoap2_Android Ksoap2 - Fatal编程技术网

Java Android上的KSoap2冻结设备,而不是进行Web服务调用

Java Android上的KSoap2冻结设备,而不是进行Web服务调用,java,android,ksoap2,android-ksoap2,Java,Android,Ksoap2,Android Ksoap2,我正在尝试连接到我为接收来自Android设备的SOAP调用而创建的.NET 4.0Web服务,为了测试目的,该服务现在托管在本地IIS上 我发现ksoap2对于我想做的事情来说是一个非常好的类库。从下载了.jar包并开始狂喜地敲击键盘。。。用我的手指 发送的信息量从几KB到几MB不等 什么在起作用 HttpTransportSE.call(String,SoapSerializationEnvelope)-方法在Eclipse的Android emulator中运行良好,将调用发送到本地IIS

我正在尝试连接到我为接收来自Android设备的SOAP调用而创建的.NET 4.0Web服务,为了测试目的,该服务现在托管在本地IIS上

我发现ksoap2对于我想做的事情来说是一个非常好的类库。从下载了.jar包并开始狂喜地敲击键盘。。。用我的手指

发送的信息量从几KB到几MB不等

什么在起作用
HttpTransportSE.call(String,SoapSerializationEnvelope)
-方法在Eclipse的Android emulator中运行良好,将调用发送到本地IIS中托管的webservice。甚至还测试了webservice从同一局域网中的web浏览器打开服务地址时收到的空呼叫

什么不起作用 当我将.apk文件复制到Android设备上,安装它,启动它并尝试拨打电话时,整个程序在没有拨打电话的情况下冻结

从显示的代码块中可以看出,在考虑了可能的错误之后,出现了一些行:在模拟环境中,成功的调用会返回SoapPrimitive对象,或流入正确的catch块,根据当前情况为用户生成错误消息

然后,在实时Android设备上,程序将永远失去响应,必须从应用程序菜单中终止

我试过什么 我从异步方法中删除了调用,并尝试直接从为按钮单击事件指定的匿名内部函数调用它

试着不想得到回应,只是打电话

尝试获取设备的logcat程序以查看UI后面发生了什么,发现两个,他们需要根访问权限,而我在设备中没有。这就是为什么我没有任何logcat向您展示的原因,而展示模拟器logcat可能是无用的,因为它在那里工作得很好

未尝试连接到本地主机

尝试在运行安卓4.2.2的旧款联想平板电脑和全新的三星Galaxy Tab上安装该程序时,两者都会遇到同样的问题,否则效果会很好

代码 下面是在设备/模拟器中进行调用的异步方法,其中变量
str_URL
soapRequest
分别是正确的服务地址(选中)和格式良好的SoapObject:

@Override
protected WebServiceResult doInBackground(Void... v) {
    WebServiceResult _ret;
    SoapSerializationEnvelope soapEnvelope= new SoapSerializationEnvelope(SoapEnvelope.VER11);
    soapEnvelope.dotNet=true;
    soapEnvelope.setAddAdornments(false);
    soapEnvelope.setOutputSoapObject(soapRequest);
    HttpTransportSE conn = new HttpTransportSE(str_URL);
    conn.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    conn.debug = true;
    try {
        conn.call(str_ACTION, soapEnvelope); 
        SoapObject o = (SoapObject)soapEnvelope.getResponse();
        _ret = new WebServiceResult(o, WebServiceResultEnum.ok);
    } catch (NetworkOnMainThreadException e) {
        _ret = new WebServiceResult(null, WebServiceResultEnum.keskeytys);
    } catch (HttpResponseException e) {
        _ret = new WebServiceResult(null, WebServiceResultEnum.httpVirhe);
    } catch (XmlPullParserException e) {
        _ret = new WebServiceResult(null, WebServiceResultEnum.vaara_muoto);
    } catch (SocketTimeoutException e) {
        _ret = new WebServiceResult(null, WebServiceResultEnum.aikakatkaisu);
    } catch (Exception e) {
        _ret = new WebServiceResult(null, WebServiceResultEnum.keskeytys);
    }
    return _ret;
}
@覆盖
受保护的WebServiceResult doInBackground(无效…v){
WebServiceResult;
SoapSerializationEnvelope soapEnvelope=新的SoapSerializationEnvelope(soapEnvelope.VER11);
soapEnvelope.dotNet=true;
soapEnvelope.SetAddAdorments(假);
setOutputSoapObject(soapRequest);
HttpTransportSE conn=新的HttpTransportSE(str_URL);
conn.setXmlVersionTag(“”);
conn.debug=true;
试一试{
连接呼叫(str_动作,soapEnvelope);
SoapObject o=(SoapObject)soapEnvelope.getResponse();
_ret=newWebServiceResult(o,WebServiceResultEnum.ok);
}捕获(NetworkOnMainThreade异常){
_ret=newWebServiceResult(null,WebServiceResultEnum.keskeytys);
}捕获(HttpResponseException e){
_ret=newWebServiceResult(null,WebServiceResultEnum.httpVirhe);
}catch(XMLPullParseRexE){
_ret=newWebServiceResult(null,WebServiceResultEnum.vaara_muoto);
}捕获(SocketTimeoutException e){
_ret=newWebServiceResult(null,WebServiceResultEnum.aikakakatkaisu);
}捕获(例外e){
_ret=newWebServiceResult(null,WebServiceResultEnum.keskeytys);
}
返回(ret);;
}

提前谢谢你

您是否可能正在做这样的事情:

YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {

    public interface FinishedListener {
        public void onFinished(WebServiceResult result);
    }

    private final FinishedListener finishedListener;

    public ExampleTask(FinishedListener listener) {
        this.finishedListener = listener;
    }

    @Override
    protected WebServiceResult doInBackground(Void... params) {
        WebServiceResult result = ...;
        return result;
    }

    @Override
    protected void onPostExecute(WebServiceResult result) {
        super.onPostExecute(result);

        if(this.finishedListener != null) {
            this.finishedListener.onFinished(result);
        }
    }
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
    @Override
    public void onFinished(WebServiceResult result) {
        // This will be called if the task has finished
    }
});
task.execute();
因为那是错误的,完全错误的。如果直接调用
doInBackground()
,它将在同一
线程中运行,而不是在新线程中运行。您需要像这样使用
execute()
启动
AsyncTask

YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {

    public interface FinishedListener {
        public void onFinished(WebServiceResult result);
    }

    private final FinishedListener finishedListener;

    public ExampleTask(FinishedListener listener) {
        this.finishedListener = listener;
    }

    @Override
    protected WebServiceResult doInBackground(Void... params) {
        WebServiceResult result = ...;
        return result;
    }

    @Override
    protected void onPostExecute(WebServiceResult result) {
        super.onPostExecute(result);

        if(this.finishedListener != null) {
            this.finishedListener.onFinished(result);
        }
    }
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
    @Override
    public void onFinished(WebServiceResult result) {
        // This will be called if the task has finished
    }
});
task.execute();

您需要像这样实现
AsyncTask

YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {

    public interface FinishedListener {
        public void onFinished(WebServiceResult result);
    }

    private final FinishedListener finishedListener;

    public ExampleTask(FinishedListener listener) {
        this.finishedListener = listener;
    }

    @Override
    protected WebServiceResult doInBackground(Void... params) {
        WebServiceResult result = ...;
        return result;
    }

    @Override
    protected void onPostExecute(WebServiceResult result) {
        super.onPostExecute(result);

        if(this.finishedListener != null) {
            this.finishedListener.onFinished(result);
        }
    }
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
    @Override
    public void onFinished(WebServiceResult result) {
        // This will be called if the task has finished
    }
});
task.execute();

似乎我已经在AndroidManifest.xml中将最小SDK声明为14,将目标SDK声明为17。我没有在较新的sdk中使用任何花哨的东西,所以我将目标sdk降低到与最小sdk相同的级别,14。我也有一个前卫!我删除的平板电脑上运行的防病毒服务


这解决了我的问题。那可能是最前卫的!防病毒程序想阻止未从Play store下载的应用程序的所有通信。我不知道更改目标SDK是否真的有多大效果。

不,logcat不需要root。如果您在后台执行网络操作,它不会冻结您的UI,除非您不明智地让UI线程等待后台操作或其结果。您可以在IDE中查看logcat,而不需要应用程序。感谢您提供正确使用异步方法的全面说明。这些我都不知道!但正如我在最初的帖子中所说的,我已经尝试从异步方法中删除对webservice的调用,并在UI中直接调用。我知道Android不喜欢主线程中的网络操作,这就是为什么我为它设置了一个catch块,这样我就可以查看调用是否有效。编辑:过早提交评论。继续:所以我完全按照您的指示进行了更改,但程序仍然在真实设备上冻结,并在emulator上工作。