Ошибка разбора Android JSON в HTTP-ответе - PullRequest
0 голосов
/ 09 октября 2018

Я вызываю http-запрос в Android с использованием залпа, но иногда я получаю ошибку синтаксического анализа JSON при получении ответа, даже если ответ всегда одинаков.

void login() throws JSONException {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = String.format("%s/login", getString(R.string.url));
    JSONObject data = new JSONObject();
    data.put("email", etEmail.getText().toString());
    data.put("password", etPassword.getText().toString());
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.POST, url, data, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Helper.unblockUI(pb, getWindow());
                try{
                    if(response.has("error")){
                        Toast.makeText(LoginActivity.this, response.getString("error"), Toast.LENGTH_SHORT).show();
                    }else if(response.has("id") && response.has("token")){
                        enterMainActivity();
                    }else{
                        Toast.makeText(LoginActivity.this, "Something is wrong", Toast.LENGTH_SHORT).show();
                    }
                } catch (JSONException e){
                    Helper.unblockUI(pb, getWindow());
                    Toast.makeText(LoginActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Helper.unblockUI(pb, getWindow());
                Toast.makeText(LoginActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
            }
    });

    Helper.blockUI(pb, getWindow());
    queue.add(jsonObjectRequest);
}

и ответ:

{"error":"Email doesn't exist"}

когда ответ выглядит так, что он не содержит ошибок, потому что это допустимый JSON, я не знаю почему, но иногда ответ выглядит так:

{"error":"Email doesn't exist"

это минус одна скобка в конце, поэтому залповый ответ - это ошибка, потому что это недопустимый JSON.

есть идеи, почему это происходит?потому что иногда он получает действительный json, а иногда нет, я всегда возвращаю один и тот же ответ от API, но иногда ответ равен минус одна скобка в конце объекта json.

Вывод в случае успеха: 2018-10-09 21:05:22.717 12545-12545/com.omg_indo.itmsapp D/tag: {"error":"Email doesn't exist"}

Вывод при ошибке: 2018-10-09 21:08:02.019 12545-12545/com.omg_indo.itmsapp D/tag: com.android.volley.ParseError: org.json.JSONException: Unterminated object at character 30 of {"error":"Email doesn't exist"

1 Ответ

0 голосов
/ 09 октября 2018

Я не уверен, является ли это причиной вашей проблемы, но вы можете попробовать использовать глобальную очередь одноэлементных запросов вместо создания новой локальной в вашем методе.Чтобы сделать это, вы должны оставить RequestQueue в качестве переменной-члена в вашем Application классе.

class MyApplication extends Application{


    private static MyApplication sInstance;
    private RequestQueue mRequestQueue;


    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
    }

    public static MyApplication getInstance() {
        return sInstance;
    }


    public synchronized RequestQueue getRequestQueue() {
        if( mRequestQueue == null )
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());

        return mRequestQueue;
    }


}

И тогда вы будете использовать его следующим образом:

MyApplication.getInstance().getRequestQueue().add( jsonObjectRequest );

сохраняйте очередь запросов в течение всего срока службы вашего приложения

Документация немного двусмысленна по этому поводу, хотя - в какой-то момент они говорят

Ключевая концепция заключается в том, что RequestQueue должен быть создан с помощью Application.контекст, а не контекст деятельности.Это гарантирует, что RequestQueue будет длиться в течение всего жизненного цикла вашего приложения, а не воссоздается каждый раз, когда воссоздается действие (например, когда пользователь поворачивает устройство).

Но они также говорят

Если вам просто нужно сделать одноразовый запрос и не хотите оставлять пул потоков, вы можете создать RequestQueue там, где вам это нужно, и вызвать stop () в RequestQueue, как только выответ или ошибка были возвращены с использованием метода Volley.newRequestQueue () [...]

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

...