возвращаемое значение после запуска другого AsyncTask в onPostExecute () - PullRequest
0 голосов
/ 03 апреля 2019

Как вернуть значение в основное действие после запуска другого AsyncTask в onPostExecute ()?

Я написал функцию во 2-й Asynctask, чтобы вернуть ArrayList обратно в 1-ю Asynctask.Однако я не знаю, как вернуть ArrayList из 1-й Asynctask обратно в основное действие.

//Main Activity:
DownloaderGet downloaderGet = new DownloaderGet(getActivity(), "http://xxxxx.php");
downloaderGet.execute();

//1st AsyncTask(DownloaderGet)
@Override
    protected void onPostExecute(String jsonData) {
        super.onPostExecute(jsonData);
        new DataParserGet(c, jsonData).execute();
    }

//2nd Asynctask(DataParserGet)
@Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);

        pd.dismiss();
        if(result)
        {
            myNewArrayList = spacecrafts;
            passToClass();
        }
    }

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Вы можете сделать это, следуя этим шагам

Создать interface

public interface AsyncResponse {
  void passToClass(Boolean output);
}

Вы можете изменить параметр passToClass () по своему желанию.

Объявите экземпляр AsyncResponse в AsyncTask

public AsyncResponse delegate = null;

В onPostExecute

delegate.passToClass(result);

Тогда заставьте вас Activity реализовать AsyncResponse

public class MainActivity implements AsyncResponse

Наконец переопределите ваш метод и получите результат в Activity

@Override
void passToClass(Boolean output){
 //here you get the reuslt from AsyncTask
}
0 голосов
/ 04 апреля 2019

Проблема: Вы хотите передать список массивов из второго AsyncTask обратно в MainActivity.

Решение: Передача экземпляра действия в первый AsyncTask, а затем пересылка экземпляра во второй AsyncTask.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Pass `this` as activity instance to the first AsyncTask.
        DownloaderGet downloaderGet = new DownloaderGet(this, "http://xxxxx.php");
        downloaderGet.execute();
    }

    public void onDataAvailable(List<String> arrauList) {
        // Process array list here.

    }
}

// The first AsyncTask.
class DownloaderGet extends AsyncTask<Void, Void, String> {
    private WeakReference<MainActivity> activity;
    private String url;

    DownloaderGet(MainActivity activity, String url) {
        this.activity = new WeakReference<>(activity);
        this.url = url;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // Your code here
        // ...
        return null;
    }

    @Override
    protected void onPostExecute(String jsonData) {
        // Forward the instance to the second AsyncTask.
        new DataParserGet(activity.get(), jsonData).execute();
    }
}

class DataParserGet extends AsyncTask<Void, Void, Boolean> {
    private WeakReference<MainActivity> activity;
    private String jsonData;

    DataParserGet(MainActivity activity, String jsonData) {
        this.activity = new WeakReference<>(activity);
        this.jsonData = jsonData;
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        // Your code here
        // ...
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            myNewArrayList = spacecrafts;
            if (activity.get() != null) {
                // Pass the array list back to main activity.
                activity.get().onDataAvailable(myNewArrayList);
            }
        }
    }
}
0 голосов
/ 03 апреля 2019

Asynctask используется для выполнения длительных операций.

Если вы уже используете одну asynctask, вам не нужна другая asynctask.Попробуйте поместить весь этот второй асинхронный код в первый.

public void doInBackground(){

  //Sample1

  //Dependent code waiting for sample1 to finish

}

Вы можете подождать, пока какой-то код завершит работу, и вы сможете ввести его в другой фрагмент кода, все внутри только одной асинктаск.Чтобы вернуть некоторый код в MainActivity из asynctask, используйте функцию обратного вызова с использованием интерфейса.

  1. Создание интерфейса
public interface MyTaskCallback{
  void myResultData();
}
Реализация интерфейса в пункте назначения.В вашем случае MainActivity является пунктом назначения.
public void MainActivity extends AppCompatActivity implements MyTaskCallback{



   public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);

    //Start the task. Pass interface reference in the constructor of the task
    new MyTask(MainActivity.this).execute();
   }
}
Передать ссылку интерфейса в AsyncTask Constructor из Activity
public void MyTask extends AsyncTask<Void, Void, Void>{

   private MyTaskCallback myTaskCallback;

   public MyTask(myTaskCallback){
     this.myTaskCallback = myTaskCallback;
   }

   public void onPostExecute(){
     if(myTaskCallback != null)
        myTaskCallback.myResultData();
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...