网络Api列表中的重复项目调用Android

时间:2018-06-13 19:15:59

标签: android android-fragments android-recyclerview duplicates

我在tablayout中托管了两个片段,附加到一个活动。在两者中,我正在进行网络调用以成功地在recyclerview中显示数据。

问题在于当我从导航抽屉打开另一个活动并从活动返回到其中一个片段时,列表会重复,另一个api调用会被添加到列表中。

我尝试使用onStart, onStop and onDestroy方法清除列表中的旧项目,如下所示:

public class SciFiFragment extends Fragment {

private static final String TAG = SciFiFragment.class.getSimpleName();

private RecyclerView scifiRV;

private List<Object> objectList = new ArrayList<>();
private ScifiWallpaperAdapter adapter;

private boolean hasItems = false;
private PixaImages pixaImages;

public SciFiFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View sv = inflater.inflate(R.layout.fragment_sci_fi, container, false);

    scifiRV = sv.findViewById(R.id.scifiRV);
    scifiRV.setHasFixedSize(true);
    scifiRV.setLayoutManager(new LinearLayoutManager(getActivity()));

    if (Utils.isNetwork(getActivity())){
        fetchWallpapers();
    } else {
        // TODO: 6/12/2018 get from cache
        Snackbar.make(getActivity().findViewById(android.R.id.content), "Check Connection", Snackbar.LENGTH_LONG).show();
    }

    return sv;
}

@Override
public void onPause() {
    super.onPause();
    objectList.clear();
    objectList.remove(pixaImages);
    Log.d(TAG, "onPause---Size:\t" + objectList.size());
}

@Override
public void onStop() {
    super.onStop();
    objectList.clear();
    objectList.remove(pixaImages);
    Log.d(TAG, "onStop---Size:\t" + objectList.size());
}

@Override
public void onDestroy() {
    super.onDestroy();
    objectList.clear();
    objectList.remove(pixaImages);
    Log.d(TAG, "onDestroy---Size:\t" + objectList.size());
}

private void fetchWallpapers() {
    String url = Constants.PIXABAY_BASE_URL + "?key=" + Constants.PIX_API_KEY + "&q=nature&orientation=vertical&category=science";
    Log.d(TAG, "Scifi URL:\t" + url);
    AndroidNetworking.get(url)
            .setPriority(Priority.HIGH)
            .setTag("Get Scifi Wps")
            .getResponseOnlyIfCached()
            .build()
            .getAsJSONObject(new JSONObjectRequestListener() {
                @Override
                public void onResponse(JSONObject response) {
                    if (response != null){
                        Log.d(TAG, "Nature Wps Response:\t" + response.toString());
                        try {
                            JSONObject jsonObject = new JSONObject(response.toString());
                            JSONArray array = jsonObject.getJSONArray("hits");
                            for (int m = 0; m < array.length(); m++){
                                JSONObject items = array.getJSONObject(m);

                                pixaImages = new PixaImages();
                                pixaImages.setImgId(items.getInt("id"));
                                pixaImages.setLargeImgURL(items.getString("largeImageURL"));
                                pixaImages.setPageURL(items.getString("pageURL"));
                                pixaImages.setPreviewImgURL(items.getString("previewURL"));

                                objectList.add(pixaImages);
                                Log.d(TAG, "List size:\t" + objectList.size());
                                adapter = new ScifiWallpaperAdapter(getActivity(), objectList);
                                scifiRV.setAdapter(adapter);

                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }

                @Override
                public void onError(ANError anError) {
                    Log.d(TAG, "Failure NATURE Wps:\t" + anError.getMessage().toString());
                }
            });
}

}

仅当我退出应用程序,打开另一个应用程序或最近的应用程序屏幕时才有效,但当我在同一个应用程序中打开另一个活动时,列表会重复。如何确定何时进行网络呼叫,是否可以定期进行w/o duplicates

2 个答案:

答案 0 :(得分:0)

我认为这个想法并不是要清除以前的数据,而是建议您通过使用startActivityForResult为下一个活动提供午餐来维持API调用的活动状态,

或者您可以删除从后台堆栈进行调用的活动,并使用意图每次启动它。

同样在Recycler视图中,适配器notifyDatasetChanged是一种非常有用的方法,可以帮助适配器知道数据何时发生了变化。

答案 1 :(得分:0)

尝试在添加项目之前清除列表,而不是在onPause或onResume上清除它 此外,您不需要每次都创建和设置适配器,在启动时执行一次 并在您的适配器中创建一个方法,如下所示:

Date

现在,请记住,您的方法每次都会转储所有信息,您可能希望添加一种机制来仅请求您不具备的对象。