使用接口将结果从AsyncTask传输到MainActivity

时间:2016-09-09 21:15:34

标签: android android-asynctask nullpointerexception

在我的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

中执行AsyncTask后快速循环了Log
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的一些基本概念,那么几周前就开始学习了。谢谢。

2 个答案:

答案 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中是如何工作的。