Возврат объекта из метода onPostExecute () - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть следующий класс AsyncTask, который я хочу обработать несколько вызовов API и вернуть список обратно в мою деятельность.У меня возникают проблемы при попытке сделать эту работу.

Как я могу вернуть объект обратно в свою деятельность, если метод onPostExecute() ничего не возвращает?

public class NetworkCall extends AsyncTask<Call, Void, List<Student>> {

@Override
protected List<Students> doInBackground(Call... calls) {
    try {
        Call<Students> call = calls[0];
        Response<Students> response = call.execute();
        return response.body().getStudents();

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
    }

    @Override
    protected void onPostExecute(List<Students> students) { 

    }
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вы можете реализовать так:

Ваш интерфейс:

public interface OnTaskCompleted{
  void onTaskCompleted(Object o);
}

Ваша активность:

public class YourActivity implements OnTaskCompleted{
// your Activity

@Override
void onTaskCompleted(Object o){

}

И ваша AsyncTask:

public class YourTask extends AsyncTask<Object,Object,Object>{ //change Object 
to required type
private OnTaskCompleted listener;

public YourTask(OnTaskCompleted listener){
    this.listener=listener;
   }

// required methods

protected void onPostExecute(Object o){
    // your stuff
    listener.onTaskCompleted(o);
   }
}
0 голосов
/ 10 февраля 2019

Один из вариантов - создать интерфейс и использовать его как обратный вызов.В классе асинхронных задач:

public class NetworkCall extends AsyncTask<Call, Void, List<Student>> {

public interface NetworkCallback{
    void onResponse(List<Students> students);
}

private NetworkCallback callback;

public void setCallback(NetworkCallback callback){
    this.callback = callback;
}

@Override
protected List<Students> doInBackground(Call... calls) {
    try {
        Call<Students> call = calls[0];
        Response<Students> response = call.execute();
        return response.body().getStudents();

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
    }

    @Override
    protected void onPostExecute(List<Students> students) { 
        callback.onResponse(students)
    }
} 

и теперь в вашей деятельности реализуйте интерфейс и предоставьте асинхронную задачу через установщик.

public class StudentsActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //.... you setup for activity

    NetworkCall networkCall = new NetworkCall();
    networkCall.setCallback(new NetworkCall.NetworkCallback() {
      @Override
      public void onResponse(List<Students> students) {
        //update your UI here
      }
    });
  }
}

На основе Документов onPostExecute работает в основном потоке пользовательского интерфейса, поэтому нет необходимости в runOnUiThread и Runnable

...