JSONException возвращает ошибку "Нет значения для поиска"? - PullRequest
0 голосов
/ 13 июня 2018

Я практикуюсь в создании приложения с использованием API фильмов.Идея такова:

1 - пользователь вводит название фильма.

2 - возьмите это имя и поместите его в виде ссылки, например:

Constants.URL_LEFT+ searchTerm + Constants.URL_RIGHT + Constants.API_KEY

И здесь у меня есть две вероятности:

1 - введенные слова верны и соответствуют названию фильманапример («Бэтмен»), тогда все правильно.

2 - неверно введенное слово, например («Бамтан»), тогда у меня появляется сообщение об ошибке «Нет значения для поиска»

Примечание:

1 - Я пытаюсь использовать метод onErrorResponse (), но он работает только в noInternetConnection!

2 - Я пытаюсь решить проблему с помощью try / catch, Мое приложение осталось в подвохеarea!

Мой вопрос: Как я могу обработать неправильный ввод (неправильный URL)?

Вот мой код для этого:

public List<Movie> getMovies(final String searchTerm){
    movieList.clear();

    JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET, Constants.URL_LEFT + searchTerm + Constants.URL_RIGHT + Constants.API_KEY,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray moviesArray = response.getJSONArray("Search");
                        for (int i = 0 ; i < moviesArray.length() ; i++){
                            JSONObject movieObj = moviesArray.getJSONObject(i);

                            Movie movie = new Movie();
                            movie.setTitle(movieObj.getString("Title"));
                            movie.setYear(" Released on : " + movieObj.getString("Year"));
                            movie.setMovieType("Type : " + movieObj.getString("Type"));
                            movie.setPoster(movieObj.getString("Poster"));
                            movie.setImdbId(movieObj.getString("imdbID"));

                            movieList.add(movie);
                        }
                        // notify the adapter for changes! very important...
                        movieRecyclerViewAdapter.notifyDataSetChanged();

                    } catch (JSONException e) {
                        e.printStackTrace();
                        // app just save the exception and repeat it after that for correct values also!
                        if (e.getMessage().equals("No value for Search")){
                            Toast.makeText(MainActivity.this, "Can not find any movie with this name!", Toast.LENGTH_SHORT).show();
                            MainActivity.this.onRestart();
                            popupDialog();
                        }

                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // dealing with losing network connection
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
            alertDialogBuilder.setTitle("Error Found!")
                    .setMessage("Make Sure you have a network Connection!")
                    .setCancelable(false);

            alertDialogBuilder.setPositiveButton("Refresh", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // re-check the internet connection!
                    getMovies(searchTerm);
                }
            })
                    .setNegativeButton("Exit!", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // close the App!
                    finish();
                }
            });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    });
    queue.add(objectRequest);
    return movieList;
}

Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 16 июня 2018

Прежде всего, спасибо @Psypher и @GautamSurani за помощь.

Проблема решена с помощью:

1 - Удалите новое обновление HAXM и установите старую версию и создайте новуюВиртуальное устройство.

2 - обновление if(moviesArray==null), которое я написал выше с if (!response.has("Search")) причина ответа всегда имеет ответ!

что я думаю

Эмулятор сохраняет последнее значение ошибки SharedPreferences (которое было введено пользователем) и сохраняет его, даже если пользователь ввел правильное значение.

0 голосов
/ 13 июня 2018

Проверьте, является ли moviesArray нулевым после JSONArray moviesArray = response.getJSONArray("Search");, имеет ли оно нулевое значение, которое будет означать, что поиск не найден, и его нет в ответе json, и вы можете отобразить свое сообщение о том, что фильм не найден.

Ниже как это выглядит с изменениями

JSONArray moviesArray = response.getJSONArray("Search");
     if(moviesArray==null){
       Toast.makeText(MainActivity.this, "Can not find any movie with this name!", Toast.LENGTH_SHORT).show();
      }
       else
      {
        for (int i = 0 ; i < moviesArray.length() ; i++){
        JSONObject movieObj = moviesArray.getJSONObject(i);

        Movie movie = new Movie();
        movie.setTitle(movieObj.getString("Title"));
        movie.setYear(" Released on : " + movieObj.getString("Year"));
        movie.setMovieType("Type : " + movieObj.getString("Type"));
        movie.setPoster(movieObj.getString("Poster"));
        movie.setImdbId(movieObj.getString("imdbID"));

        movieList.add(movie);
    }
    // notify the adapter for changes! very important...
    movieRecyclerViewAdapter.notifyDataSetChanged();
   }
} catch (JSONException e) {
    e.printStackTrace();
...