Android 如何在onCreate方法中从asynctask获取和显示arraylist结果

Android 如何在onCreate方法中从asynctask获取和显示arraylist结果,android,android-asynctask,Android,Android Asynctask,我正在从事udacity流行电影第一阶段项目,该项目将允许我从MovieDB数据库中发现电影 我创建了Movie、MovieAdapter和MainActivity(内部类为FetchMovieAsyncTask)类。但我一直在错误下面 java.lang.NullPointerException:尝试调用接口方法 空对象引用上的“int java.util.List.size()” 这是我的密码 电影类: public class Movie{ private String mMov

我正在从事udacity流行电影第一阶段项目,该项目将允许我从MovieDB数据库中发现电影

我创建了
Movie
MovieAdapter
MainActivity
(内部类为
FetchMovieAsyncTask
)类。但我一直在错误下面

java.lang.NullPointerException:尝试调用接口方法 空对象引用上的“int java.util.List.size()”

这是我的密码

电影类:

public class Movie{

    private String mMovieTitle;
    private String mPosterPath;
    private String mOverview;
    private String mReleaseDate;
    private double mRating;

    public Movie(){
        mMovieTitle = null;
        mPosterPath = null;
        mOverview = null;
        mReleaseDate = null;
        mRating = -1.0;
    }

    public Movie(String title){
        mMovieTitle = title;
    }


    public Movie(String title, String posterPath, String overview, String releaseDate, double rating){
        mMovieTitle = title;
        mPosterPath = posterPath;
        mOverview = overview;
        mReleaseDate = releaseDate;
        mRating = rating;
    }

    public String getMovieTitle(){
        return mMovieTitle;
    }

    public String getPosterPath(){
        return mPosterPath;
    }

    public String getOverview(){
        return mOverview;
    }

    public String getReleaseData(){
        return mReleaseDate;
    }

    public double getRating(){
        return mRating;
    }


}
MovieAdapter类:

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

/**
 * Created by ibayp on 04/08/2017.
 */

public class MovieAdapter extends ArrayAdapter<Movie> {
    Context context;
    ArrayList<Movie> movies;
    public MovieAdapter(Context context, ArrayList<Movie> movies){
        super(context, 0, movies);
        this.context = context;
        this.movies = movies;
    }


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view = convertView;

        if(view == null){
            view = LayoutInflater.from(getContext()).inflate(R.layout.poster_list, parent, false);
        }

        ImageView imageView = (ImageView)view.findViewById(R.id.movie_poster);

        Picasso.with(getContext())
                .load("https://image.tmdb.org/t/p/w500/kqjL17yufvn9OVLyXYpvtyrFfak.jpg")
                .into(imageView);

        return view;
    }
}
导入android.content.Context;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入com.squareup.picasso.picasso;
导入java.util.ArrayList;
/**
*由ibayp于2017年8月4日创建。
*/
公共类MovieAdapter扩展了ArrayAdapter{
语境;
ArrayList电影;
公共电影适配器(上下文、ArrayList电影){
超级(上下文、0、电影);
this.context=上下文;
这部电影=电影;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
视图=转换视图;
如果(视图==null){
view=LayoutInflater.from(getContext()).flate(R.layout.poster_list,parent,false);
}
ImageView=(ImageView)view.findViewById(R.id.movie\u海报);
Picasso.with(getContext())
.加载(“https://image.tmdb.org/t/p/w500/kqjL17yufvn9OVLyXYpvtyrFfak.jpg")
.进入(图像视图);
返回视图;
}
}
主要活动类别:

package com.android.ibayp.popularmovies;

import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    GridView gridView;
    ArrayList<Movie> movies;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new FetchMovieAsyncTask().execute("popularity.desc");
        MovieAdapter adapter = new MovieAdapter(this, movies);


        gridView = (GridView)findViewById(R.id.grid_view);
        gridView.setAdapter(adapter);
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
                Movie movie = (Movie)parent.getItemAtPosition(position);
                Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                intent.putExtra("title", movie.getMovieTitle());
                startActivity(intent);
            }
        });
    }

    private class FetchMovieAsyncTask extends AsyncTask<String, Void, ArrayList<Movie>> {
        private final String TAG = com.android.ibayp.popularmovies.FetchMovieAsyncTask.class.getSimpleName();

        private static final String API_KEY = "api key";
        private static final String BASE_URL = "https://api.themoviedb.org/3/discover/movie?";

        private String API_PARAM = "api_key";
        private String SORT_BY = "sort_by";

        public URL buildURL(String[] sortMethod){
            Uri builtUri = Uri.parse(BASE_URL).buildUpon()
                    .appendQueryParameter(API_PARAM, API_KEY)
                    .appendQueryParameter(SORT_BY, sortMethod[0])
                    .build();

            URL url = null;
            try{
                url = new URL(builtUri.toString());
            }catch (MalformedURLException e){
                e.printStackTrace();
            }

            Log.v(TAG, "BUILT URI: " +url);

            return url;
        }

        private String makeHttpRequst(URL url)throws IOException {
            String jsonResponse = "";
            HttpURLConnection urlConnection = null;
            InputStream inputStream = null;
            try{
                urlConnection = (HttpURLConnection)url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();
                inputStream = urlConnection.getInputStream();
                jsonResponse = readStream(inputStream);
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                if(urlConnection!=null){
                    urlConnection.disconnect();
                }
                if (inputStream!=null){
                    inputStream.close();
                }
            }
            return jsonResponse;
        }

        private String readStream(InputStream inputStream) throws IOException{
            StringBuilder results = new StringBuilder();
            if(inputStream!=null){
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
                BufferedReader reader = new BufferedReader(inputStreamReader);
                String line = reader.readLine();
                while (line!=null){
                    results.append(line);
                    line = reader.readLine();
                }
            }

            return results.toString();
        }

        private ArrayList<Movie> getMovieFromJson(String movieJson){
            movies = new ArrayList<Movie>();
            try{
                JSONObject baseResponse = new JSONObject(movieJson);
                JSONArray resultsArray = baseResponse.getJSONArray("results");
                Log.v(TAG, "Array Results: "+resultsArray.length());
                if (resultsArray.length() > 0){
                    for (int i = 0; i<resultsArray.length(); i++ ){
                        JSONObject movieInformation = resultsArray.getJSONObject(i);
                        movies.add(new Movie(movieInformation.getString("title"),
                                movieInformation.getString("poster_path"),
                                movieInformation.getString("overview"),
                                movieInformation.getString("release_date"),
                                movieInformation.getDouble("vote_average")));

                    }
                }
            }catch (JSONException e){
                Log.v(TAG, "Problem parsing Json" + e);
            }

            return movies;
        }

        @Override
        protected ArrayList<Movie> doInBackground(String... strings) {
            URL url = buildURL(strings);

            String jsonResponse = "";
            try{
                jsonResponse = makeHttpRequst(url);
            }catch (IOException e){
                Log.v(TAG, "IO Exception error "+e);
            }

            movies = getMovieFromJson(jsonResponse);

            return movies;
        }

        @Override
        protected void onPostExecute(ArrayList<Movie> movies) {
            if (movies==null){
                return;
            }

            super.onPostExecute(movies);
        }
    }


}
package com.android.ibayp.popularmovies;
导入android.content.Intent;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.GridView;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.nio.charset.charset;
导入java.util.ArrayList;
公共类MainActivity扩展了AppCompatActivity{
GridView;
ArrayList电影;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
新建FetchMovieAsyncTask().execute(“popularity.desc”);
MovieAdapter=新的MovieAdapter(这是电影);
gridView=(gridView)findViewById(R.id.grid\u视图);
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图视图、整型位置、长l){
Movie Movie=(Movie)parent.getItemAtPosition(position);
意向意向=新意向(MainActivity.this、DetailActivity.class);
intent.putExtra(“title”,movie.getMovieTitle());
星触觉(意向);
}
});
}
私有类FetchMovieAsyncTask扩展了AsyncTask{
private final String TAG=com.android.ibayp.popularmovies.FetchMovieAsyncTask.class.getSimpleName();
私有静态最终字符串API_KEY=“API KEY”;
私有静态最终字符串BASE_URL=”https://api.themoviedb.org/3/discover/movie?";
私有字符串API_PARAM=“API_key”;
私有字符串SORT\u BY=“SORT\u BY”;
公共URL构建URL(字符串[]排序方法){
Uri builtUri=Uri.parse(BASE_URL).buildon()
.appendQueryParameter(API参数,API键)
.appendQueryParameter(排序依据,排序方法[0])
.build();
URL=null;
试一试{
url=新url(builtUri.toString());
}捕获(格式错误){
e、 printStackTrace();
}
Log.v(标记“内置URI:+url”);
返回url;
}
私有字符串makeHttpRequest(URL)引发IOException{
字符串jsonResponse=“”;
HttpURLConnection-urlConnection=null;
InputStream InputStream=null;
试一试{
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();
inputStream=urlConnection.getInputStream();
jsonResponse=readStream(inputStream);
}捕获(IOE异常){
e、 printStackTrace();
}最后{
if(urlConnection!=null){
urlConnection.disconnect();
}
如果(inputStream!=null){
inputStream.close();
}
}
返回jsonResponse;
}
私有字符串读取流(InputStream InputStream)引发IOException{
StringBuilder结果=新建StringBuilder();
如果(inputStream!=null){
InputStreamReader InputStreamReader=新的InputStreamReader(inputStream,Charset.forName(“UTF-8”);
BufferedReader reader=新的BufferedReader(inputStreamReader);
字符串行=reader.readLine();
while(行!=null){
结果:追加(行);
line=reader.readLine();
}
}
返回结果。toString();
}
私有ArrayList getMovieFromJson(字符串movieJson){
    @Override
    protected void onPostExecute(ArrayList<Movie> movies) {
        if (movies==null){
            return;
        }

        super.onPostExecute(movies);
        MovieAdapter adapter = new MovieAdapter(MainActivity.this, movies);
        gridView.setAdapter(adapter);
    }
MovieAdapter adapter = new MovieAdapter(MainActivity.this, movies);
gridView.setAdapter(adapter);