【问题标题】:Android Volley Cache Creates DuplicatesAndroid Volley 缓存创建重复项
【发布时间】:2020-11-28 03:30:08
【问题描述】:

我正在对我的回收站视图数据使用 Volley 缓存。它在网上工作得很好。当我切换到离线时,它会正确显示所有数据,但每当我从离线切换回在线时,它会在首次启动时创建重复副本,而在重新启动应用程序时消失。

这是主要活动代码:

     private JsonArrayRequest getDataFromServer(int requestCount) {
    //Initializing ProgressBar
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar2);

    //Displaying Progressbar
    progressBar.setVisibility(View.VISIBLE);
    setProgressBarIndeterminateVisibility(true);

    Intent intent = getIntent();
    String gradevalue = intent.getExtras().getString("gradename");

            //JsonArrayRequest of volley
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.CATEGORY_URL + String.valueOf(requestCount) + Config.CATEGORY_URL2+ gradevalue ,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    for (int i = 0; i < response.length(); i++) {
                        //Creating the superhero object
                        Categories gradee = new Categories();
                        JSONObject json = null;
                        try {
                            //Getting json
                            json = response.getJSONObject(i);

                            //Adding data to the superhero object
                            gradee.setImageUrl(json.getString(Config.TAG_C_IMAGE_URL));
                            gradee.setName(json.getString(Config.TAG_C_NAME));

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        
                        listCategories.add(gradee);
                    }

                    //Notifying the adapter that data has been added or changed
                    adapter.notifyDataSetChanged();
                    progressBar.setVisibility(View.GONE);

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);

                }
            }) {
        @Override
        protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
            try {
                Cache.Entry cacheEntry = HttpHeaderParser.parseCacheHeaders(response);
                if (cacheEntry == null) {
                    cacheEntry = new Cache.Entry();
                }
                final long cacheHitButRefreshed = 3 * 60 * 1000; 
                final long cacheExpired = 24 * 60 * 60 * 1000; 
                long now = System.currentTimeMillis();
                final long softExpire = now + cacheHitButRefreshed;
                final long ttl = now + cacheExpired;
                cacheEntry.data = response.data;
                cacheEntry.softTtl = softExpire;
                cacheEntry.ttl = ttl;
                String headerValue;
                headerValue = response.headers.get("Date");
                if (headerValue != null) {
                    cacheEntry.serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
                }
                headerValue = response.headers.get("Last-Modified");
                if (headerValue != null) {
                    cacheEntry.lastModified = HttpHeaderParser.parseDateAsEpoch(headerValue);
                }
                cacheEntry.responseHeaders = response.headers;
                final String jsonString = new String(response.data,
                        HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONArray(jsonString), cacheEntry);
            } catch (UnsupportedEncodingException | JSONException e) {
                return Response.error(new ParseError(e));
            }
        }

        @Override
        protected void deliverResponse(JSONArray response) {
            super.deliverResponse(response);
        }

        @Override
        public void deliverError(VolleyError error) {
            super.deliverError(error);
        }

        @Override
        protected VolleyError parseNetworkError(VolleyError volleyError) {
            return super.parseNetworkError(volleyError);
        }
    };

    return jsonArrayRequest;
} 
private void getData() {
    //Adding the method to the queue by calling the method getDataFromServer
    requestQueue.add(getDataFromServer(requestCount));
    
    requestCount++;
} private boolean isLastItemDisplaying(RecyclerView recyclerView) {
    if (recyclerView.getAdapter().getItemCount() != 0) {
        int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
            return true;
    }
    return false;
}


@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    //Ifscrolled at last then
    if (isLastItemDisplaying(recyclerView1)) {
        //Calling the method getdata again
        getData();
    }
}

当从离线切换到在线时,它会给出重复的视图,在重启时会消失,这是截图

如果有人可以查看代码并找出问题所在,我相信这是一个小问题。让我知道解决此问题的可能方法。谢谢。

【问题讨论】:

  • 请帮助大家
  • 请帮帮我

标签: android android-studio android-layout android-recyclerview android-volley


【解决方案1】:

无法评论。您可以将 JSON 响应放入列表中,并在每次离线时清除它。或者将响应放入 LinkedHashSet,清除列表,然后用集合填充该列表。

    listCategories.add(gradee));
    LinkedHashSet<Categories> set = new LinkedHashSet<>(listCategories);
                    listCategories.clear();
                    listCategories.addAll(new ArrayList<>(set));

这应该会删除重复项。

【讨论】:

  • 我不明白在我的代码中哪里实现它?
  • 对我的回答稍作修改。您可以在填充列表的位置添加它:在 listCategories.add(gradee) 下面
  • 切换到改造 :)
  • 嘿,我想知道当没有要显示的缓存数据时调用哪个方法,我想在那里显示一个 toast。你能帮忙吗?
  • 我不明白你的问题。你能改写一下吗?
猜你喜欢
  • 2020-11-28
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2017-01-19
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多