Android从AsyncTask中的processFinish返回值

Android从AsyncTask中的processFinish返回值,android,android-asynctask,Android,Android Asynctask,在下面的代码中,我想从processFinish方法传递数据,以便在类外使用,但我无法解决问题,也无法从call函数中的processFinish返回值 public class WSDLHelper implements AsyncResponse{ public SoapObject request; private String MainResult; public String call(SoapObject rq){ new Proces

在下面的代码中,我想从
processFinish
方法传递数据,以便在类外使用,但我无法解决问题,也无法从
call
函数中的
processFinish
返回值

public class WSDLHelper  implements AsyncResponse{
    public SoapObject request;

    private String MainResult;

    public String call(SoapObject rq){

        new ProcessTask(rq, this).execute();
        return MainResult;
    }

    @Override
    public void processFinish(String output) {
        MainResult = output;
    }
}

class ProcessTask extends AsyncTask<Void, Void,  String> {
    public AsyncResponse delegate=null;

    SoapObject req1;

    public ProcessTask(SoapObject rq, AsyncResponse delegate) {
        req1 = rq;
        this.delegate = delegate;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(this.req1);

        AndroidHttpTransport transport = new AndroidHttpTransport(Strings.URL_TSMS);
        transport.debug = true;

        String result = null;
        try {
            transport.call(Strings.URL_TSMS + this.req1.getName(), envelope);
            result = envelope.getResponse().toString();
        } catch (IOException ex) {
            Log.e("" , ex.getMessage());
        } catch (XmlPullParserException ex) {
            Log.e("" , ex.getMessage());
        }

        if (result.equals(String.valueOf(Integers.CODE_USER_PASS_FALSE))) {
            try {
                throw new TException(PublicErrorList.USERNAME_PASSWORD_ERROR);
            } catch (TException e) {
                e.printStackTrace();
            }
        }

        return result;
    }

    protected void onPostExecute(String result) {
        delegate.processFinish(result);
    }
}
公共类WSDLHelper实现异步响应{
公共对象请求;
私有字符串mainsult;
公共字符串调用(SoapObject rq){
新建ProcessTask(rq,this).execute();
返回主结果;
}
@凌驾
公共void processFinish(字符串输出){
MainResult=输出;
}
}
类ProcessTask扩展了AsyncTask{
公共异步响应委托=null;
SOAPObjectReq1;
公共ProcessTask(SoapObject rq、AsyncResponse委托){
req1=rq;
this.delegate=委托;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护字符串doInBackground(无效…参数){
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
信封.setOutputSoapObject(this.req1);
AndroidHttpTransport=新的AndroidHttpTransport(Strings.URL\u TSMS);
transport.debug=true;
字符串结果=null;
试一试{
transport.call(Strings.URL\u TSMS+this.req1.getName(),信封);
结果=envelope.getResponse().toString();
}捕获(IOEX异常){
Log.e(“,例如getMessage());
}捕获(XmlPullParserException-ex){
Log.e(“,例如getMessage());
}
if(result.equals(String.valueOf(Integers.CODE\u USER\u PASS\u FALSE))){
试一试{
抛出新的TException(PublicErrorList.USERNAME\u PASSWORD\u ERROR);
}捕获(特克斯){
e、 printStackTrace();
}
}
返回结果;
}
受保护的void onPostExecute(字符串结果){
委托。进程完成(结果);
}
}

请帮助我开发
call
方法,将
output
值返回到课外。谢谢

现在您正在实施AsyncResponce。 所以 替换

然后您的类
重写
方法p
processfinish(字符串输出)
将调用


并在processFinish()处使用您的值,而不是调用()方法返回的值。

ProcessTask是一个异步任务,因此当您调用
call
方法时,当
returnmainsult
时,您将得到
null
,因为它还没有被
processFinish
方法设置。

委托在onPostExecute上是否为null?因为如果没有,那么它就按预期工作了。@PedroOliveira是的,这是空的。如何解决这个问题?。Mahdi,请理解返回的主要结果;在MainResult之前运行=输出;因此,无论您做什么,调用(…)都将始终返回null。这两个问题实际上都是的repost。不要解决
新ProcessTask(rq,this).execute()的问题;返回主结果
使用此实现的方法
@Override public void processFinish(字符串输出){MainResult=output;}
R您调试的代码是否有任何异常?是。这是return null,您正在从调用(…)方法返回值。请在processFinished()上使用值。这是AsyncTask功能,您不能在call method.post更新时返回它。谢谢
new ProcessTask(rq, new AsyncResponse() {
            @Override
            public void processFinish(String output) {
                MainResult = output;
            }
        }).execute();
new ProcessTask(rq, this).execute();