在我的AsyncTask中,我doInBackground
返回一个Movie对象数组。在搜索了如何实现这一点之后,我找到了this SO post并实现了标记答案建议的解决方案。唯一的区别是,与在 MainActivity 中的onCreate
方法中运行AsyncTask相反,我在 MainActivity中的onOptionsItemSelected
方法中运行了AsyncTask 。
我不太确定解决方案在processFinish
方法的实现中是什么意思,所以我实现了我的方法(在 MainActivity 中)。 list_of_movies
变量是一个全局变量,我打算稍后将其传递给GridView。
@Override
public void processFinish(Movie[] movies){
for(int i = 0; i < movies.length; i++){
list_of_movies[i] = movies[i];
}
}
为了检查我是否真的拥有list_of_movies
内的所有电影对象,我在onOptionsItemsSelected
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_popular) {
FetchMovieTask movieTask = new FetchMovieTask();
movieTask.delegate = this;
movieTask.execute("popular");
for(int i = 0; i < list_of_movies.length; i++){
Log.v("Loop Logging", list_of_movies[i].getTitle());
}
return true;
}
return super.onOptionsItemSelected(item);
}
这会给我一个java.lang.NullPointerException
我已尝试过以下
1)我想也许我不允许在onOptionsItemSelected
内调用此操作,所以我在onCreate
尝试了相同的操作。也是同样的错误
2)我只是在list_of_movies = movies
方法中设置processFinish
,但这不起作用
我在这里做错了什么?
我想也许是因为我将public
添加到processFinish
方法,但没有public
Android Studio因为一些冲突问题而无法编译。另一个理论是list_of_movies
指向什么都没有,但我认为这是使用接口传输Movie []的全部要点。
很抱歉,如果我只是误解了Android的一些基本概念,那么几周前就开始学习了。谢谢。
答案 0 :(得分:3)
我认为你误解了AsyncTask正在做什么。
它正在后台执行操作,当完成时,转到processFinish
界面的delegate
。同时,execute
方法之后的所有代码都继续运行。
因此,如果这导致错误,你会感到惊讶吗? list_of_movies
变量尚未包含任何数据。
for(int i = 0; i < list_of_movies.length; i++){
Log.v("Loop Logging", list_of_movies[i].getTitle());
}
FetchMovieTask movieTask = new FetchMovieTask();
movieTask.delegate = this;
movieTask.execute("popular");
答案 1 :(得分:0)
从doInBackground返回的列表将传递给onPostExecute接口方法。所以你可以在AsyncTask类中执行类似下面的操作。
@Override
protected void onPostExecute(Movie[] movies) {
for(int i = 0; i < movies.length; i++){
list_of_movies[i] = movies[i];
}
Here是我给出的另一个解决方案/答案,它可以让你更好地了解Asynctask在android中是如何工作的。