Обработка метода OnErrorResponse - залп

Я получаю данные с сервера в формате json, используя залп. При подключении к Wifi все работает нормально. Но когда пользователь подключен к мобильным данным и особенно если мобильное соединение для передачи данных медленное, вызывается метод OnErrorResponse. Я поместил сообщение Toast в метод OnErrorResponse. На некоторых устройствах это всплывающее сообщение завершается сбоем с исключением NullPointerException, в то время как на других оно работает нормально.

Также, если я жду долго, а результаты еще не отображаются, приложение вылетает с ошибкой outofmemory. Помогите, пожалуйста.

Как эффективно решать эти проблемы?

Код:

private RequestQueue songQueue = songQueue = Volley.newRequestQueue(getContext());



 private void getNewSongs() {

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, newSongsUrl, null, new Response.Listener<JSONObject>() {
        @SuppressLint("LongLogTag")
        @Override
        public void onResponse(JSONObject response) {

            JSONObject artistObject = null;
            String artist = "";
            String albumID = "";
            String artistID = null;

            try {


                JSONObject songListObjects = response.getJSONObject("new_song");

                    if (songListObjects.has("data")){

                        JSONObject data = songListObjects.getJSONObject("data");

                        if (data.has("song_list")) {

                            JSONArray songList = data.getJSONArray("song_list");

                            for (int i=0;i<5;i++){

                                JSONObject songListObject = songList.getJSONObject(i);

                                if (songListObject.has("mid")) {

                                    Log.e("SongListObject has", "songmid");
                                    String songID = songListObject.getString("mid");
                                    String songTitle = songListObject.getString("name");
                                    long duration = songListObject.getLong("interval") * 1000;
                                    Log.e("Title:", songTitle);
                                    Log.e("Duration:", String.valueOf(duration));

                                    JSONObject albumObject  = songListObject.getJSONObject("album");

                                    if (albumObject.has("mid")){

                                        albumID = albumObject.getString("mid");


                                    }



                                    JSONArray artistArray = songListObject.getJSONArray("singer");

                                    for (int j = 0; j < artistArray.length(); j++) {

                                        artistObject = artistArray.getJSONObject(j);

                                        if (j == 0) {

                                            if (artistObject.has("name")) {


                                                Log.e("ArtistObject: ", "has name");

                                                artist = artistObject.getString("name");
                                                artistID = artistObject.getString("mid");

                                            }
                                        } else {

                                            if (artistObject.has("name")) {

                                                Log.e("ArtistObject: ", "has name");

                                                artist = artist + " ft. " + artistObject.getString("name");

                                            }
                                        }
                                    }


                                    SongInfoModel songInfoModel = new SongInfoModel(123, songTitle,artistID, ((artist == null || (artist.length() == 0)) ? "Unknown" : artist), duration, songData, albumArtURL);
                                    SoundCloudNewSongs.add(songInfoModel);

                                    if (getView() != null){

                                        getView().findViewById(R.id.onlineProgressLoad).setVisibility(View.GONE);
                                        getView().findViewById(R.id.mainLayout).setVisibility(View.VISIBLE);

                                    }



                                }

                            }


                        }
                    }



                newSongsAdapter = new NewSongsAdapter(SoundCloudNewSongs, getContext(),listenerOnline,1);
                recyclerView_newSongs.setAdapter(newSongsAdapter);


            } catch (JSONException e) {


            }

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


            if (error.getMessage()==null)
            Toast.makeText(getActivity(), "Timeout error :(", Toast.LENGTH_SHORT).show();
            else Toast.makeText(getActivity(), "Timeout error :(", Toast.LENGTH_SHORT).show();


        }
    });

    songQueue.add(jsonObjectRequest);

}

Logcat:

java.lang.NullPointerException: 
  at android.widget.Toast.<init> (Toast.java:114)
  at android.widget.Toast.makeText (Toast.java:277)
  at android.widget.Toast.makeText (Toast.java:267)
  at com.musicplayer.musicana.OnlinePlaySupport$9.onErrorResponse (Unknown Source:15)
  at com.android.volley.Request.deliverError (Unknown Source:8)
  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run (Unknown Source:62)
  at android.os.Handler.handleCallback (Handler.java:790)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6518)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)

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

Pavneet_Singh 30.06.2018 22:02

Если вы рекомендуете это решение для второй проблемы, ничего страшного. Но для первого?

Sebin Paul 30.06.2018 22:05

да, решение для первого, вы определяете время и количество повторных попыток, позвольте мне показать вам

Pavneet_Singh 30.06.2018 22:05

Если запрос залпа терпит неудачу в первый раз, то, конечно же, будет вызван метод onErrorResponse, отсюда и сбой. Верно?

Sebin Paul 30.06.2018 22:07

нет, вся цель повтора - попытаться сколько раз для успешного выполнения вызова

Pavneet_Singh 30.06.2018 22:15

Так почему в моем коде вызывается метод OnErrorResponse?

Sebin Paul 30.06.2018 22:16

вы используете retrypolicy? и если повторных попыток 3 и onerrorresponse вызывается один раз, это идеальное поведение, а также проверяет сетевое подключение перед выполнением запроса, возможно, сеть вообще не подключена

Pavneet_Singh 30.06.2018 22:21

На самом деле я не использую retryPolicy. И приложение вылетает, давая NPE при вызове сообщения Toast. Это почему?

Sebin Paul 30.06.2018 22:23

Вы можете опубликовать полную информацию о логике NPE?

Pavneet_Singh 30.06.2018 22:24

Мое приложение действительно опубликовано. Я выложу отчет о сбое консоли google.

Sebin Paul 30.06.2018 22:25

Размещено ..... пожалуйста, взгляните на это

Sebin Paul 30.06.2018 22:26

Позвольте нам продолжить обсуждение в чате.

Pavneet_Singh 30.06.2018 22:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
12
465
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(
    1000*5, 
    /*DefaultRetryPolicy.DEFAULT_MAX_RETRIES*/ 3, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
songQueue.add(jsonObjectRequest);

О NPE. Возможно, что VolleyError имеет значение null, чтобы вы могли использовать

if (error!=null && error.getMessage()==null)

60 * 1000 * 5 для?

Sebin Paul 30.06.2018 22:11

И снова, если запрос не выполняется, вызывается метод OnErrorResponse, верно?

Sebin Paul 30.06.2018 22:12

Модификация бита 1000*5 означает пятисекундную задержку, где 1000 - миллисекунды, а цель повторных попыток - сделать запрос успешным с максимальным количеством попыток

Pavneet_Singh 30.06.2018 22:19

Итак, если я понял это правильно, это означает, что запрос будет отправлен 3 раза (каждый из 5 секунд тайм-аута) до успеха, верно?

Sebin Paul 30.06.2018 22:21

Другие вопросы по теме