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。
所以
替换
借
然后您的类重写
方法pprocessfinish(字符串输出)
将调用
并在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();