java.lang.RuntimeException:在Popmovie应用程序中执行doInBackground()时发生错误

时间:2016-02-08 10:18:45

标签: java android

我是android开发的初学者。 我正在尝试制作电影应用,但我收到了这个错误。 这是我的代码

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) 

1 个答案:

答案 0 :(得分:0)

方法movies中有未初始化的arraylist getMovieDataFromJson()

所以当你致电movies.add(indexMovie);时会引起NPE, 解决这个变化:

ArrayList<Movie> movies = null;

到这个

ArrayList<Movie> movies = new ArrayList<>();
方法getMovieDataFromJson()

中的