Android 如何在onCreate方法中从asynctask获取和显示arraylist结果
我正在从事udacity流行电影第一阶段项目,该项目将允许我从MovieDB数据库中发现电影 我创建了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
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);