Как получить значение AsyncHttpClient onSucces?

У меня есть AsyncHttpClient, который делает запрос на получение URL-адреса. Я приму ответ метода onSuccess(). Я вставляю свой код, чтобы лучше объяснить.

CategoryActivity.java вызывает метод getXML класса "XMLParser". В этом методе это AsyncHttpClient.

    XMLParser parser = new XMLParser(URL);
    xml = parser.getXML(URL);

XMLParser.java имеет .getXML(url) и возвращает строку. Я создаю переменную xmlResponse для ввода значения ответа, но это не так.

    public String getXML(String url) {
    // get connection..
    String xmlResponse = "";

    AsyncHttpClient client = new AsyncHttpClient();
    client.get(url, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            super.onSuccess(response);
            xmlResponse = response;
        }
        @Override
        public void onFailure(Throwable e) {
            ma.showUserAlertQuestion();
        }
    });
    return xmlResponse;
}

Как мне вернуть это значение? Заранее спасибо и извините за мой плохой английский.


person Tenaciousd93    schedule 21.06.2013    source источник


Ответы (2)


На самом деле это состояние гонки. Причина, по которой вы не можете получить значение xmlResponse, заключается в том, что ваш HTTP-запрос является асинхронным методом, и результат возвращается до того, как он получит ответ от сервера.

Этот ответ в основном объясняет все, чтобы получить значение ответа onSuccess(), вам нужно использовать интерфейс:

public Interface XMLCallback {
    onSuccess(String response);
}

В вашем классе парсера:

public String getXML(String url, XMLCallback callback) {
    AsyncHttpClient client = new AsyncHttpClient();
    client.get(url, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            super.onSuccess(response);
            callback.onSuccess(response);
        }
        @Override
        public void onFailure(Throwable e) {
            ma.showUserAlertQuestion();
        }
    });
}

И в вашем классе активности:

private String XMLResponse = "";

XMLParser parser = new XMLParser(URL);
xml = parser.getXML(URL, new XMLCallback() {
    @Override
    public void onSuccess(String response) {
        XMLResponse = response;
    }
});
person Mike Xiao    schedule 29.09.2017

У меня та же проблема, что и у вас, но в другом контексте. Вы можете увидеть это здесь: https://stackoverflow.com/questions/21578458/return-asynch-data-to-method-android-java Я также ищу решение, но не нашел его в данный момент.

Причина, по которой вы не получаете результатов в возвращаемом значении, проста. Когда вы делаете: client.get(), сообщение отправляется на сервер. Затем ваш код сразу же возвращает xmlResponse. Метод onSucces будет вызываться после возврата, потому что программное обеспечение достигает оператора возврата быстрее, чем сообщение из асинхронного вызова возвращается сервером.

В теме, которую я показал вам выше, есть решение для этого. Но это решение не соответствовало тому, как я планировал свое приложение. Возможно, он подойдет для вашего приложения.

person P Griep    schedule 05.02.2014