【问题标题】:onLoadFinished called with wrong data even if loadInBackground returns correct data即使 loadInBackground 返回正确的数据,onLoadFinished 也会调用错误的数据
【发布时间】:2018-06-16 10:50:24
【问题描述】:

我正在制作一个应用来显示电影列表,如屏幕截图所示。

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

我该如何解决这个问题,因为 我只希望新数据出现在列表中。我试过 onLoaderReset 但它没有被调用,因为活动没有被破坏,我无法找到任何其他方式来取消引用旧数据,或者换句话说 首先清空旧的已经获取的列表然后用新获取的列表替换它

如何实现上述..?

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

这是应用程序的屏幕截图:- 更新 --> 实际问题不在 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;
}
}

谢谢。

【问题讨论】:

  • 在 onFinished 中你清除了 movieTitleAndPosterPathFinalList 和 addAll 相同的列表。意味着您首先清空列表,然后在其中添加。
  • 是的。我已经这样做了,但即使在那之后它也无济于事。实际上,movieTitleAndPosterPathList 是在我解释过的之后返回的。
  • 显示你在父类中的 onLoadFinished。
  • 父类 ??这是主要课程。我应该展示什么课程?
  • LoaderManager.LoaderCallbacks

标签: android android-lifecycle asynctaskloader


【解决方案1】:

这可以通过清除 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重启之前调用这个方法。

【讨论】:

  • 好的,但是,刚才我在 loadInBackground() 中添加了这行代码并将本地数组列表添加到加载程序后,我注意到了另一件事。代码是:if(!receivedArrayList.isEmpty()) { receivedArrayList.clear(); } receivedArrayList = JSONUtils.parseMovieJSON(jsonReceived); return receivedArrayList; 在此之后,我注意到的是,当我点击评分最高时,RecyclerView 确实会更新,但新电影是在播放旧电影之后,当我点击一部电影然后只返回时放映新电影。
  • 我可以确认这一点,因为我使用了 Log 语句来检查是否返回了 ''if'' 语句。虽然,我现在正在尝试你的方法来检查。
  • 是的,@TrishantSharma 我也遇到了同样的情况,但是在那之后,我通过首先使用我现在共享的代码清除适配器中的数据然后重置分页条件然后调用来解决它Loader 进行网络调用。
  • 关于您的答案的另一件事是,您提供的方法进入 Adapter 类,但返回给 onLoadFinished 的列表是错误的,然后将错误的列表提供给 Adapter。向适配器添加一些东西不会有太大帮助。
  • 我找不到你。怎么会是错的?你的意思是不是在查询当前选中的选项?
【解决方案2】:

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

这是我在 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 是 static,因此我必须在添加新数据之前对其进行clear

因为我没有清除它,所以数据总是被附加到列表中,因此返回到 onLoadFinished 的列表中有重复的项目。

感谢@KavinRajuS 花时间帮助我解决这个问题。 因此,问题现已解决,应用运行良好。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多