Volley никогда не возвращает VolleyError или объясняет, почему существует исключение

С библиотеками Volley я расширил объект Request для реализации сериализации GSON. Затем я расширил этот новый объект для того, как я хочу сделать некоторые из моих PUT Запросы. Это первый объект для сериализации GSON:

@Override  
protected Response<t> parseNetworkResponse(NetworkResponse response) {  
    try {  
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //response may be too large for string?
        t parsedGSON = mGson.fromJson(jsonString, cls);
        Response <t> returnMessage = Response.success(parsedGSON,  
                HttpHeaderParser.parseIgnoreCacheHeaders(response));
        return returnMessage;

    } catch (UnsupportedEncodingException e) { 
        e.printStackTrace();
        return Response.error(new ParseError(e));  
    } catch (JsonSyntaxException je) {
        je.printStackTrace();
        Log.e("GsonRequest", je.getMessage()!=null?je.getMessage():"JsonSyntaxError");
        return Response.error(new ParseError(je));  
    }  
}  

Когда мой сетевой ответ достигает Response <t> returnMessage = Response.success(parsedGSON, HttpHeaderParser.parseIgnoreCacheHeaders(response)); Я заселился <t> объекты с правильными классами, которые я передал, полностью сериализованы со всеми переменными и без ошибок. И все же по какой-то причине Волей } catch (JsonSyntaxException je) { и я не могу раскрыть содержание je с отладкой точек останова или печати журналов. Также в моем расширенном классе:

 new ErrorListener() {
        @SuppressWarnings("unused")
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();

onErrorResponse никогда не называется (и не мой onResponse раздел либо)

Так что теперь я понятия не имею, почему Volley перехватывает JSONException, когда сериализация прошла успешно, и я понятия не имею, почему Volley не возвращает объекты Error

Понимание ценится

3 ответа

Решение

Ответ в том, что любая функция Volley, которую вы расширяете или переопределяете, должна

    @Override
protected void deliverResponse(T response) {
    // TODO Auto-generated method stub
    mListener.onResponse(response);
}

функция реализована. Слушатель должен быть инициализирован в конструкторе и иметь реализованный метод onResponse.

В противном случае ваш сетевой вызов никогда не вернется в onResponse раздел.

РЕДАКТИРОВАТЬ: и ваш расширенный класс Request должен также реализовать deliveryError вместе с deliveryResponse

private final Listener<T> mListener;
private ErrorListener mErrorListener;

@Override
 public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}

с ErrorListener инициализируется в вашем конструкторе

У меня была такая же проблема этим утром. Возможно, вы не получаете Json в качестве ответа, ваш сервер отвечает с 200 OK, но Volley ждет получения Json. Затем, когда он не получает Json, он генерирует эту ошибку, которая не имеет HTTP-код (потому что это не так), но является внутренней ошибкой залпа.

Вы можете решить проблему, используя правильный объект (из библиотеки залпа) для выполнения ваших запросов.

Если вы используете JsonObjectRequest, для залпа требуется JSONObject в теле запроса и аспектирование JSONObject в объекте ответа. Если вы используете JsonArrayRequest, для залпа требуется JSONArray в запросе и JSONArray в ответе. Для каждого отдельного случая вам нужно расширить класс JsonRequest для управления ответом.

Для JSON, почему бы вам не использовать собственный класс для ответа, например:

import com.google.gson.annotations.SerializedName;

public class UserData {
@SerializedName("email")
public String userMail;
@SerializedName("number")
public String number;
@SerializedName("loginName")
public String loginName;
@SerializedName("password")
public String password;

}

а потом

public Request<?> getInformation(String loginName, String password, Response.Listener<UserData> responseListener,
                                         Response.ErrorListener errorListener) {

    String url = apiURL;

    Map<String, String> authHeaders = getAuthHeaders(loginName, password);
    authHeaders.put(HEADER_PARAM_INTERFACE_KEY, DPAG_INTERFACE_KEY);
    int method = Request.Method.GET;

    GsonRequest<UserData> request = new GsonRequest<UserData>(
            method,
            url,
            UserData.class,
            authHeaders,
            responseListener,
            errorListener,
            gson);


    return mQueue.add(request);
}

плюс здесь onResponse и на ErrorResponse

    Application.get().getApi().getInformation(loginName, password,
            new Response.Listener<UserData>() {

                @Override
                public void onResponse(UserData data) {

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {


                }
            }
    );
Другие вопросы по тегам