Модифицированный ответ медленнее, чем HttpUrlConnection на 2G / 3G - PullRequest
0 голосов
/ 24 октября 2019

Я знаю, что это вне вопроса, который я должен использовать. Очевидно, Retrofit - рекомендуемый способ. Но я не могу понять, почему Retrofit ответ занимает около 1 минуты в сети 2G по сравнению с HttpUrlConnection, который дает ответ примерно через 15 секунд.

Код дооснащения

Call call = surveyApi.getQuestionsOfSurvey();
try {
    Response<QuestionResponse> resp= call.execute();
    Log.v(TAG, "QuestionUpdateTask: after call.execute");

    QuestionList questionList = null;
    if(resp.isSuccessful()) {
        QuestionResponse response = resp.body();
        return new QuestionList(response.getQuestions(), "Questions have been successfully updated.", null);
    } else {
        return new QuestionList(new ArrayList<Question>(), resp.message(), null);
    }
} catch (Exception e) {
    e.printStackTrace();
}

Время отклика дооснащения

21: 01: 51,858 D / OkHttp: -> GET https://server_url.com/getJson

21: 02: 34.255 D / OkHttp: <- 200 OK <a href="https://server_url.com/getQuestions" rel="nofollow noreferrer">https://server_url.com/getQuestions (42396ms)

21: 05: 28,161 D / OkHttp: [{"iableableOnQuestion ":" "," repeatableOnQuestion ":" "," unique_answers ": false," likertOptions ": []," answers "}]"

21: 05: 28.406 V / QuestionUpdateTask: QuestionUpdateTask: после call.execute

Код HttpUrlConnection

public void performUrlConnectionRequest() {
        Log.v(TAG, "performUrlConnectionRequest");
        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL("https://server_url.com/getQuestions");
            Log.v(TAG, "opening connection");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // connection ok
                BufferedReader in = new BufferedReader(new InputStreamReader( urlConnection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                Log.v(TAG, response.toString());
            } else {

            }


            Log.v(TAG, "after result");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    }

Время ответа для HttpUrlConnection

20: 58: 12.159 V / QuestionUpdateTask: executeHttpUrlConnectionRequest

20: 58: 44.820 V / QuestionUpdateTask: [{"depenableOnQuestion": "", "repeatableOnQuestion":" " "unique_answers": ложь," LikertOptions ": []," answers "}]"

У меня есть общие коды и время ответа для каждого метода. Как вы можете видеть, что время ответа на запрос Retrofit GET и его ответ 200 OK составляет около 50 секунд, но после получения 200 OK мне нужно было подождать еще 2 или 3 минуты, чтобы использовать фактический JSON. Эти 2 или 3 минуты являются переменными, иногда это занимает 1 минуту или около того. Во-вторых, в HttpUrlConnection время запроса и ответа составляет около 30 секунд.

Такое поведение невозможно понять в медленных сетях 2G / 3G и т. Д. Как мне лучше справиться с этой ситуацией? Мой ProgressDialog продолжает отображаться в течение 3 минут, что нежелательно. Какой метод я должен использовать?

...