I am beginner in android development . I am trying to make movies app but I got this error . Here is my code
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();
}
}
}
}
My code is showing an error that is written below:
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)