Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 需要从AsyncTask返回值_Java_Android_Web Services_Android Asynctask - Fatal编程技术网

Java 需要从AsyncTask返回值

Java 需要从AsyncTask返回值,java,android,web-services,android-asynctask,Java,Android,Web Services,Android Asynctask,我正在调用soap Web服务,需要显示返回的内容。但我做不到,因为异步任务很复杂,我不知道如何正确使用它。您能告诉我如何通过asynctask从被调用函数返回数据吗 这是我的密码 public class WebserviceTool { private final String NAMESPACE = "http://tempuri.org/"; private final String URL = "http://192.168.0.11:9289/Service1.asmx"; pri

我正在调用soap Web服务,需要显示返回的内容。但我做不到,因为异步任务很复杂,我不知道如何正确使用它。您能告诉我如何通过asynctask从被调用函数返回数据吗

这是我的密码

public class WebserviceTool {

private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://192.168.0.11:9289/Service1.asmx";
private final String SOAP_ACTION = "http://tempuri.org/get_currency";
private final String METHOD_NAME = "get_currency";

public static void main(String[] args) {
    // TODO Auto-generated method stub
}

public String execute_barcode_webservice(String s1, String s2) {
    //Create request
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("date",s1);
    request.addProperty("cur_code",s2);
    //Create envelope
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.encodingStyle = SoapEnvelope.ENC;
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            Object response;
    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        response = (Object) envelope.getResponse();
        Log.i("my_error", response.toString());
    } catch (Exception e) {
        Log.i("my_error", e.getMessage().toString());
    }
    return "testarif";
}

public class AsyncCallWS extends AsyncTask<String, Void, Void> {
    @Override
    protected Void doInBackground(String... params) {
        try {
            execute_barcode_webservice(params[0], params[1]);
        } catch (Exception e) {
            // TODO: handle exception
        }   
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

    }

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected void onProgressUpdate(Void... values) {

    }
}
}
公共类WebService工具{
私有最终字符串命名空间=”http://tempuri.org/";
私有最终字符串URL=”http://192.168.0.11:9289/Service1.asmx";
私有最终字符串SOAP_ACTION=”http://tempuri.org/get_currency";
私有最终字符串方法\u NAME=“获取\u货币”;
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
}
公共字符串执行\条形码\ Web服务(字符串s1、字符串s2){
//创建请求
SoapObject请求=新的SoapObject(名称空间、方法名称);
请求。添加属性(“日期”,s1);
请求。添加属性(“当前代码”,s2);
//创建信封
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.encodingStyle=SoapEnvelope.ENC;
envelope.setOutputSoapObject(请求);
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
目标反应;
试一试{
调用(SOAP_操作,信封);
response=(对象)envelope.getResponse();
Log.i(“我的错误”,response.toString());
}捕获(例外e){
Log.i(“我的错误”,例如getMessage().toString());
}
返回“testarif”;
}
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(字符串…参数){
试一试{
执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}   
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
}

这是执行所有作业并返回数据的函数execute_barcode_webservice()。但是由于我调用了execute\u barcode\u webservice()view AsyncTask,我不知道如何返回它。如何执行?

异步任务执行的结果是
执行\u barcode\u webservice()
生成的
响应
对象。但是,不要认为异步任务会执行并向您返回值。相反,在方法
onPostExecute()
中,您必须获取
响应
对象并对其进行处理(提取其值并将其显示在列表中,或者执行您想对其执行的任何操作)。异步任务只是在一个单独的线程中执行一些代码,然后返回主线程(UI线程)并处理结果的一种方式,这在
onPostExecute()
中完成

我的建议是:重写execute\u barcode\u webservice()以返回
响应
对象,而不是
字符串
(如果操作失败,该对象可以是
null
),并将该对象传递给
onPostExecute()
方法。您必须将异步任务更改为:

public class AsyncCallWS extends AsyncTask<String, Void, Object> {
    @Override
    protected Object doInBackground(String... params) {
        Object response = null;
        try {
            response = execute_barcode_webservice(params[0], params[1]);
        } catch (Exception e) {
            // TODO: handle exception
        }   
        return response;
    }

    @Override
    protected void onPostExecute(Object response) {
        if (response != null) {
            // display results in a list or something else
        }
    }
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护对象doInBackground(字符串…参数){
对象响应=null;
试一试{
响应=执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}   
返回响应;
}
@凌驾
受保护的void onPostExecute(对象响应){
if(响应!=null){
//以列表或其他形式显示结果
}
}

异步任务执行的结果是由
execute\u barcode\u webservice()
生成的
response
对象。但是,不要认为异步任务会执行并向您返回值。相反,在方法内部
onPostExecute()
您必须获取
响应
对象并对其进行处理(提取其值并将其显示在列表中,或者您想对其执行的任何操作)。异步任务只是在单独的线程中执行某些代码,然后返回主线程(UI线程)并处理结果的一种方式,这在
onPostExecute()
中完成

我的建议是:重写execute\u barcode\u webservice()以返回
响应
对象,而不是
字符串
(如果操作失败,该对象可以为
null
),并将该对象传递给
onPostExecute()
方法。您必须将异步任务更改为:

public class AsyncCallWS extends AsyncTask<String, Void, Object> {
    @Override
    protected Object doInBackground(String... params) {
        Object response = null;
        try {
            response = execute_barcode_webservice(params[0], params[1]);
        } catch (Exception e) {
            // TODO: handle exception
        }   
        return response;
    }

    @Override
    protected void onPostExecute(Object response) {
        if (response != null) {
            // display results in a list or something else
        }
    }
公共类AsyncCallWS扩展了AsyncTask{
@凌驾
受保护对象doInBackground(字符串…参数){
对象响应=null;
试一试{
响应=执行条形码Web服务(参数[0],参数[1]);
}捕获(例外e){
//TODO:处理异常
}   
返回响应;
}
@凌驾
受保护的void onPostExecute(对象响应){
if(响应!=null){
//以列表或其他形式显示结果
}
}

可能的dup:可能的dup:在doinbackground函数中,您正在返回和对象,但返回类型为void@ayilmaz:谢谢,我已经修复了代码。看,您已经掌握了这个概念!如何在onPostExecute()中显示返回的数据?我想在调用asynctask的位置返回数据。因此,在这种情况下为什么需要使用asynctask?“我想在调用asynctask的地方返回数据”-这不是一个好主意,因为您必须等待异步任务执行后才能获得数据(例如使用
while()
),这违反了并行执行点。无论您打算如何处理结果数据,请在
onPostExecute()中执行
或仍在
doInBackground()
中。如果要显示数据,必须在
onPostExecute()中完成