Я получаю данные с сервера в формате 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)
Если вы рекомендуете это решение для второй проблемы, ничего страшного. Но для первого?
да, решение для первого, вы определяете время и количество повторных попыток, позвольте мне показать вам
Если запрос залпа терпит неудачу в первый раз, то, конечно же, будет вызван метод onErrorResponse, отсюда и сбой. Верно?
нет, вся цель повтора - попытаться сколько раз для успешного выполнения вызова
Так почему в моем коде вызывается метод OnErrorResponse?
вы используете retrypolicy? и если повторных попыток 3 и onerrorresponse вызывается один раз, это идеальное поведение, а также проверяет сетевое подключение перед выполнением запроса, возможно, сеть вообще не подключена
На самом деле я не использую retryPolicy. И приложение вылетает, давая NPE при вызове сообщения Toast. Это почему?
Вы можете опубликовать полную информацию о логике NPE?
Мое приложение действительно опубликовано. Я выложу отчет о сбое консоли google.
Размещено ..... пожалуйста, взгляните на это
Позвольте нам продолжить обсуждение в чате.




Вы можете определить количество повторных попыток для успешного выполнения как
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 для?
И снова, если запрос не выполняется, вызывается метод OnErrorResponse, верно?
Модификация бита 1000*5 означает пятисекундную задержку, где 1000 - миллисекунды, а цель повторных попыток - сделать запрос успешным с максимальным количеством попыток
Итак, если я понял это правильно, это означает, что запрос будет отправлен 3 раза (каждый из 5 секунд тайм-аута) до успеха, верно?
вы можете установить количество повторных попыток с помощью
setRetryPolicy, но ошибка нехватки памяти - это другая проблема, опубликуйте трассировку стека