即使loadInBackground返回正确的数据,onLoadFinished也会使用错误的数据进行调用

时间:2018-06-16 10:50:24

标签: android android-lifecycle asynctaskloader

我正在创建一个应用程序来显示电影列表,如屏幕截图所示。

问题在于,当我选择选项菜单top_rated选项时,它会重新加载正确的数据,但返回到onLoadFinished的列表包含之前带有新数据的数据

如何将其纠正为我只希望新数据位于列表中。我尝试了 onLoaderReset ,但没有调用它,因为活动没有被销毁,我无法找到任何其他方法来取消引用旧数据,换句话说首先清空旧的已经获取的列表然后将其替换为新获取的列表

如何实现上述目标..?

还有一件事,每当我去任何其他活动,然后返回显示的数据是重复的。我知道这可能是一个生命周期问题,可以通过一些研究来解决,但只有在第一个问题得到解决后我才能做到。

以下是该应用的截图: - Screenshot of MainActivity 更新 - >实际问题不在MainActivity.java中,而是在下面的文件中,因此我的答案中提到的问题现在已经解决了。

这是我在MainActivity.java中调用的JSONUtils.java函数: -

import com.example.trishantsharma.popularmovies.Movie;

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

import java.util.ArrayList;

public class JSONUtils {
private static ArrayList<String[]> movieTitleAndPosterList = new ArrayList<>();
//ALL CONSTANTS HERE
public static ArrayList<String[]> parseMovieJSON(String jsonReceived){
    //THE PROBLEM IS HERE AND HAS BEEN RECTIFIED IN THE ANSWER
    try {
        JSONObject movieObject = new JSONObject(jsonReceived);
        JSONArray allMoviesArray = movieObject.getJSONArray(RESULT_JSON_ARRAY_STRING);
        for (int i = 0; i < 19; i++) {
            JSONObject particularMovie = allMoviesArray.optJSONObject(i);
            String movieId = Integer.toString(particularMovie.optInt(ID_JSON_OBJECT_STRING));
            String moviePoster = particularMovie.optString(POSTER_JSON_OBJECT_STRING);
            String[] singleMovieTitleAndPosterArray = {movieId,moviePoster};
            movieTitleAndPosterList.add(singleMovieTitleAndPosterArray);
        }
        return movieTitleAndPosterList;
    } catch (JSONException e){
        e.printStackTrace();
    }
    return null;
}
}

感谢。

2 个答案:

答案 0 :(得分:2)

当您单击菜单中的选项,然后重新加载数据时,可以通过清除 RecyclerView适配器中的数据来完成此操作。

这会进入您的 RecyclerView适配器类。

 public void cleatMovieData(){
    int size = movieDetails.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            movieDetails.remove(0);
        }
        notifyItemRangeRemoved(0,size);
    }
}

您可以在调用Loader重新启动之前调用此方法。

答案 1 :(得分:1)

这是我在问题中引用的答案:-

这是我在MainActivity.java中调用的JSONUtils.java函数:-

public static ArrayList<String[]> parseMovieJSON(String jsonReceived){
    movieTitleAndPosterList.clear();
    try {
        JSONObject movieObject = new JSONObject(jsonReceived);
        JSONArray allMoviesArray = movieObject.getJSONArray(RESULT_JSON_ARRAY_STRING);
        for (int i = 0; i < 19; i++) {
            JSONObject particularMovie = allMoviesArray.optJSONObject(i);
            String movieId = Integer.toString(particularMovie.optInt(ID_JSON_OBJECT_STRING));
            String moviePoster = particularMovie.optString(POSTER_JSON_OBJECT_STRING);
            String[] singleMovieTitleAndPosterArray = {movieId,moviePoster};
            movieTitleAndPosterList.add(singleMovieTitleAndPosterArray);
        }
        return movieTitleAndPosterList;
    } catch (JSONException e){
        e.printStackTrace();
    }
    return null;
}

由于此处的ArrayList是静态的,因此在添加新数据之前,我必须清除

自那时以来,我没有清除它总是将数据追加到列表中的问题,因此返回到onLoadFinished的列表具有重复项。

感谢@KavinRajuS花时间帮助我解决此查询。 因此,问题现在已解决,应用程序运行良好。