2016-02-08 2 views
-1

Я начинаю разработку Android. Я пытаюсь сделать приложение для видео, но я получил эту ошибку. Вот мой кодjava.lang.RuntimeException: Произошла ошибка при выполнении doInBackground() в приложении Popmovie

public class MovieFragment extends Fragment { 

    public MovieFragment() { 
    } 
    // ArrayAdapter<String> movieAdapter; 
    MovieAdapter movieAdapter; 
    GridView gridView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Add this line in order for this fragment to handle menu events. 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     inflater.inflate(R.menu.moviefragment, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_refresh) { 
      FetchMovieTask movieTask = new FetchMovieTask(); 
      movieTask.execute(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

    /* movieAdapter = new ArrayAdapter<String>(getActivity(), 
       R.layout.gridview_item, 
       R.id.item_imageView, 
       new ArrayList<String>()); */ 
     movieAdapter = new MovieAdapter(getActivity()); 
     gridView = (GridView)rootView.findViewById(R.id.gridview); 

     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Movie movie = movieAdapter.getItem(position); 
       //Toast.makeText(getActivity(),movieCast,Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(getActivity(),DetailActivity.class) 
         .putExtra("Movie", movie); 
         //.putExtra(Intent.) 

       startActivity(intent); 
      } 
     }); 
     return rootView; 
    } 

     public class FetchMovieTask extends AsyncTask<Void, Void,List<String>>{ 

      private final String LOG_TAG = FetchMovieTask.class.getSimpleName(); 

      protected List<String> doInBackground(Void... params){ 

       HttpURLConnection urlConnection = null; 
       BufferedReader reader = null; 

       String movieJsonStr = null; 

       try{ 

        String baseUrl = "http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc"; 
        String apiKey = "&api_key=" + BuildConfig.MOVIE_DB_ORG_API_KEY; 
        URL url = new URL(baseUrl.concat(apiKey)); 

        urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setRequestMethod("GET"); 
        urlConnection.connect(); 

        InputStream inputStream = urlConnection.getInputStream(); 
        StringBuffer buffer = new StringBuffer(); 
        if(inputStream==null) 
         return null; 

       reader = new BufferedReader(new InputStreamReader(inputStream)); 

        String line; 
        while((line = reader.readLine()) !=null) { 
         buffer.append(line + "\n"); 
        } 

        if(buffer.length()==0) 
         return null; 

        movieJsonStr =buffer.toString(); 

        // Log.v(LOG_TAG , "Movie Json String: " + movieJsonStr); 

       } catch (IOException e){ 
        Log.e(LOG_TAG, "Error ", e); 
        return null; 
       } finally { 
        if (urlConnection != null) 
         urlConnection.disconnect(); 
        if (reader != null) { 
         try { 
          reader.close(); 
         } catch (final IOException e) { 
          Log.e(LOG_TAG, "Error closing stream", e); 
         } 
        } 

       } 

       try { 
        return getMovieDataFromJson(movieJsonStr); 
       }catch (JSONException e){ 
        Log.e(LOG_TAG,"JSON Error",e); 
       } 
       return null; 
      } 

      private List<String> getMovieDataFromJson(String jsonString) throws JSONException{ 
       JSONObject movieJSON = new JSONObject(jsonString); 
       JSONArray movieArray = movieJSON.getJSONArray("results"); 
       ArrayList<Movie> movies = null; 

       List<String> urls = new ArrayList<String>(); 

       // List<String> arr = new ArrayList<String>(); 
       for(int i=0; i<movieArray.length(); i++){ 
        JSONObject indexObject = movieArray.getJSONObject(i); 
        Movie indexMovie = new Movie(); 
        indexMovie.setOverview(indexObject.getString("overview")); 
        indexMovie.setReleaseDate(indexObject.getString("release_date")); 
        indexMovie.setPosterPath(indexObject.getString("poster_path")); 
        indexMovie.setVoteAverage(indexObject.getInt("vote_average")); 

        // urls.add("http://image.tmdb.org/t/p/w185" + movie.getString("poster_path")); 

         /* arr.add("http://image.tmdb.org/t/p/w185" + movie.getString("poster_path")); 
          arr.add("http://image.tmdb.org/t/p/w185" + movie.getString("overview")); 
          arr.add("http://image.tmdb.org/t/p/w185" + movie.getString("release_date")); 
          arr.add("http://image.tmdb.org/t/p/w185" + movie.getDouble("vote_average"));*/ 

        //urls.add(arr); 
        movies.add(indexMovie); 
        // Log.v(LOG_TAG , "Movie Json String: " + indexMovie); 
        urls.add("http://image.tmdb.org/t/p/w185" + indexMovie.getPosterPath()); 

       } 
        for(String s: urls){ 
         Log.v(LOG_TAG, "Movie Entry : " + s); 
        } 
       return urls; 
      } 

      @Override 
      protected void onPostExecute(List<String> strings) { 
       movieAdapter.replace(strings); 
       gridView.setAdapter(movieAdapter); 
       //super.onPostExecute(s); 


      } 
     } 

    private class MovieAdapter extends BaseAdapter{ 
     private final String LOG_TAG = MovieAdapter.class.getSimpleName(); 
     private Context context; 
     ArrayList<Movie> movieList; 
     private final List<String> urls = new ArrayList<String>(); 
     // private final List<String> urlsList = new ArrayList<String>(); 

     public MovieAdapter(Context context){ 
      this.context= context; 
      // Collections.addAll(urls,posterPath); 
     } 

     @Override 
     public int getCount() { 
      return movieList.size(); 
     } 

     @Override 
     public Movie getItem(int position) { 
      return movieList.get(position); 
     } 

     /* public String getBaseItem(int position){ 
      return urlsList.get(position); 
     }*/ 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(convertView == null){ 
       convertView = new ImageView(context); 
      } 
      ImageView imageView = (ImageView) convertView; 

      Movie movieDb = getItem(position); 
      String url = "https://image.tmdb.org/t/p/w185" + movieDb.getPosterPath(); 

      // String url2 = getBaseItem(position); 

     // Log.e(LOG_TAG, " URL " + url); 

      Picasso.with(context).load(url).into(imageView); 

      return convertView; 
     } 

     public void replace(List<String> urls){ 
      if(urls!=null){ 
       this.urls.clear(); 
       this.urls.addAll(urls); 
       notifyDataSetChanged(); 
      } 
     } 
    } 

} 

Мой код показывает ошибку, что написано ниже:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)               at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
at com.example.android.movies.MovieFragment$FetchMovieTask.getMovieDataFromJson(MovieFragment.java:200) 
at com.example.android.movies.MovieFragment$FetchMovieTask.doInBackground(MovieFragment.java:169) at com.example.android.movies.MovieFragment$FetchMovieTask.doInBackground(MovieFragment.java:112) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137)  
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)  
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)  
at java.lang.Thread.run(Thread.java:856)  
+0

У вас есть NPE в getMovieDataFromJson линии: 200 – Unii

+0

Возможная дубликат [Что такое исключение нулевого указателя, и как это исправить?] (HTTP: //stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-fix-it) –

ответ

0

есть неинициализированная ArrayList movies в методе getMovieDataFromJson()

поэтому, когда вы звоните movies.add(indexMovie); это дело NPE, , чтобы решить эту проблему:

ArrayList<Movie> movies = null; 

к этому

ArrayList<Movie> movies = new ArrayList<>(); 

в методе getMovieDataFromJson()

+0

Я изменил две строки, как вы сказали - (1) ArrayList movies = new ArrayList (); (2) ArrayList movieList = new ArrayList (); где я определил movieAdapter, но он все еще не показывает изображения фильмов в пользовательском интерфейсе, когда я нажимаю кнопку pushh –

+0

Теперь, в чем причина этого? –

+0

попробуйте logcat 'url' изображения и посмотрите, правильный ли он URL, иначе я не уверен, так как этот вопрос касался NPE, и он был решен. – Yazan

Смежные вопросы