2014-09-10 2 views
-1

в этом ниже кодексе я хочу вернуть значение от AsyncTask с использованием интерфейса. но я получаю неправильное значение, и я не могу вернуть правильное значение с onPostExecute.Возвращаемое значение Android в AsyncTask onPostExecute с использованием интерфейса

Я разработал это link учебники с моим кодом. Я не могу правильно использовать это.

Интерфейс:

public interface AsyncResponse { 
    void processFinish(String output); 
} 

Ksoap Основной класс:

public class WSDLHelper implements AsyncResponse{ 
    public SoapObject request; 

    private String Mainresult; 

    public String call(SoapObject rq){ 

     ProcessTask p =new ProcessTask(rq); 
     String tmp = String.valueOf(p.execute()); 

     p.delegate = this; 

     return Mainresult; 
    } 


    @Override 
    public void processFinish(String output) { 

     this.Mainresult = output; 
    } 
} 
class ProcessTask extends AsyncTask<Void, Void, Void > { 
    public AsyncResponse delegate=null; 

    SoapObject req1; 
    private String result; 
    public ProcessTask(SoapObject rq) { 
     req1 = rq; 
    } 

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

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

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

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

     try { 
      transport.call(Strings.URL_TSMS + this.req1.getName(), envelope); 
      this.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(); 
      } 

     } 

     Log.e("------------++++++++++++++++-----------", this.result); 

     return null; 
    } 

    protected void onPostExecute(String result) { 
    /* super.onPostExecute(result);*/ 
     delegate.processFinish(this.result); 
    } 

} 

Пожалуйста, помогите мне решить эту проблему

+2

изменить тип возвращаемого 'doInBackground()' , 'onPostExecute()', а затем вернуть ваш объект с помощью оператора 'return' –

ответ

0

Ваш результат всегда будет нулевым, потому что вы возвращаетесь нуль в методе doInBackground() , Возвращаемое значение в doInBackground() будет передано onPostExecute(). Измените свой AsyncTask<Void, Void, Void> на AsyncTask<Void, Void, String> и верните результат. Это вызовет onPostExecute(String result) с правильным результатом.

Возможно, эта ссылка может помочь вам немного: http://bon-app-etit.blogspot.be/2012/12/using-asynctask.html

0

Это не может работать. Вы создаете и выполняете AsyncTask (асинхронно!), А затем вызываете return Mainresult (синхронно!), Когда он еще не получил результат. Решение состоит в том, чтобы удалить резервированной класс WSDLHelper и получить доступ к ProcessTask непосредственно

Кроме этого, вы используете AsyncTask неправильно (сохранение результата в переменной класса, а не передать его в качестве параметра). Вот полная версия:

public 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 Void 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 != null && result.equals(String.valueOf(Integers.CODE_USER_PASS_FALSE))) { 
     try { 
      throw new TException(PublicErrorList.USERNAME_PASSWORD_ERROR); 
     } catch (TException e) { 
      e.printStackTrace(); 
     } 

    } 

    Log.e("------------++++++++++++++++-----------", result); 

    return result; 
} 

protected void onPostExecute(String result) { 
/* super.onPostExecute(result);*/ 
    delegate.processFinish(result); 
} 

} 

Теперь вы должны выполнить ProcessTask снаружи, как это, который будет убедиться, что вы получить результат асинхронно:

new ProcessTask(rq, new AsyncResponse() { 
    @Override 
    public void processFinish(String output) { 
     // do whatever you want with the result 
    } 
}).execute(); 
+0

Спасибо, сэр. как я могу разработать метод 'call' в' WSDLHelper'? я получаю ошибку в 'Contsructor' в' ProcessTask p = new ProcessTask (rq); 'Я изменяю это на' public String call (SoapObject rq) { ProcessTask p = new ProcessTask (rq, this); /* String tmp = String.valueOf (p.execute()); p.delegate = this; */ возвращение MainResult; } ', но это неверно. –

+0

На самом деле, я не видел вашего «p.delegate = this». Это неправильно во многих отношениях ... Вы не поняли концепцию интерфейсов. Вы выполняете AsyncTask и ожидаете немедленного возврата его результата. Это асинхронно, так что это невозможно! Я уточню свой ответ. – 0101100101

+0

Прошу прощения, сэр. Я разрабатываю код обновления до http://paste.debian.net/120158/. но это неправильно и возвращает 'NullPointerException'. –