Как мне обратиться к переменной через несколько последовательных, зависимых AsyncTasks в Java для Android? - PullRequest
1 голос
/ 16 мая 2019

Мне нужно отправить последовательность вызовов API, где ответ на первый вызов содержит адрес API, необходимый для второго вызова. Затем я хочу отправить результаты второго вызова обратно в MainActivity. Кроме того, каждый ответ обновляется с течением времени, когда возвращаются результаты этих вызовов.

Я настроил свой код для использования последовательности AsyncTasks с критериями успеха и неудачи, чтобы они оставались активными. Несмотря на изучение практически каждой статьи, которую я могу по этому поводу, ни одна из них, похоже, не показывает, как ссылаться и анализировать возвращенную переменную из метода execute () в коде вместо непосредственного обновления графического интерфейса. Мне также нужно сделать все это без утечки памяти или блокировки основных потоков.

class CheckItemStatus extends AsyncTask<Void, Void, String> {

    private final String itemName;
    String mResponse = "";
    String submitReportURL = "stackoverflow.com";

    public CheckItemStatus(String itemName) {
        this.itemName = itemName;
    }

    protected String doInBackground(Void... urls) {
        new RetrieveFeedTask(submitReportURL).execute();

        return mResponse;
    }

    protected void onPostExecute(String response) {
        super.onPostExecute(response);

        String reportURLResponse = "";

        // TODO: Retrieve new response
        Log.i("APP", "Item check submitted! Response: " + reportURLResponse);

        String reportURL = ""; // TODO: Parse new response for report URL
        new CheckReportResults(itemName, reportURL).execute();
    }
}

class CheckReportResults extends AsyncTask<Void, Void, String> {

    private final String itemName;
    private final String reportURL;
    String mResponse = "";

    public CheckReportResults(String itemName, String reportURL) {
        this.itemName = itemName;
        this.reportURL = reportURL;
    }

    protected String doInBackground(Void... urls) {
        Log.i("APP", "Waiting for results for item " + itemName);

        new RetrieveFeedTask(reportURL).execute();

        return mResponse;
    }

    protected void onPostExecute(String response) {
        super.onPostExecute(response);
    }
}

class RetrieveFeedTask extends AsyncTask<Void, Void, String> {

    String URL;


    public RetrieveFeedTask(String URL) {
        this.URL = URL;
    }

    protected String doInBackground(Void... urls) {
        String response="{\n" +
                "    \"reportURL\": \"stackoverflow.com\"\n" +
                "}";

        // Open Connection and Get Response
        return response;
    }

    protected void onPostExecute(String response) {
        super.onPostExecute(response);

        if (response == null) {
            response = "THERE WAS AN ERROR";
        }

        Log.i("INFO", "Response: " + response);

    }
}

В настоящее время код выполняется, но я не знаю, как анализировать и ссылаться на эти ответы вне класса AsyncTask.

...