【问题标题】:Problems with getting listview cache using volley使用 volley 获取列表视图缓存的问题
【发布时间】:2014-04-29 20:39:59
【问题描述】:

由于某种原因,我无法使用 volley 检索缓存响应。

这是我的片段:

RequestQueue queue = VolleySingleton.getInstance(getActivity()).getRequestQueue();

        JsonObjectRequest JOR = new JsonObjectRequest(Request.Method.GET, url, null,

                new Response.Listener<JSONObject>()
                {

                    @Override
                    public void onResponse(JSONObject response) {
                        if(getActivity()!=null && isVisible()){
                        try 
                            {
                            JSONArray posts = (JSONArray) response.getJSONArray("posts");

                            for(int i=0; i<posts.length();i++){
                                HashMap<String, String> map = new HashMap<String, String>();
                                //TAG_TITLE.add(posts.getJSONObject(i).getString("title"));
                                String title = posts.getJSONObject(i).getString(TAG_TITLE);
                                Log.d("Checking Title", "title"+TAG_TITLE);
                                String message = posts.getJSONObject(i).getString(TAG_MESSAGE);
                                String myevent_img = posts.getJSONObject(i).getString(TAG_IMG);
                                String sponser = posts.getJSONObject(i).getString(TAG_SPONSER);
                                String whoinvited = posts.getJSONObject(i).getString(TAG_WHOINVITED);
                                String location = posts.getJSONObject(i).getString(TAG_LOCATION);
                                String dresscode = posts.getJSONObject(i).getString(TAG_DRESSCODE);
                                String time = posts.getJSONObject(i).getString(TAG_TIME);
                                String endtime = posts.getJSONObject(i).getString(TAG_ENDTIME);

                                //_list.add(myevent_img);
                                 map.put(TAG_SPONSER, sponser);
                                 map.put(TAG_TITLE, title);
                                 map.put(TAG_LOCATION, location);
                                 map.put(TAG_TIME, time);
                                 map.put(TAG_ENDTIME, endtime);
                                 map.put(TAG_MESSAGE, message);
                                 map.put(TAG_WHOINVITED, whoinvited);
                                 map.put(TAG_DRESSCODE, dresscode);
                                 map.put(TAG_IMG, myevent_img);
                                Log.d("jobj ", "event_img"+myevent_img);
                                Log.d("hashmap ", "sponser "+map.get("sponser").toString());
                                eventList.add(map);
                            }
                            } 
                        catch (JSONException e) 
                            {
                            }

                            Log.d("getActivity ", "getActivity is not null");
                        adapter = new LazyAdapter(getActivity(), eventList);
                        list.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                        }else
                        {
                            Log.d("getActivity ", "getActivity IS NULLL!!");

                            //list.setAdapter(null);
                            //adapter.notifyDataSetChanged();

                        }

                    }}, new Response.ErrorListener(){

                        @Override
                        public void onErrorResponse(VolleyError Error) {
                            Toast.makeText(getActivity(), Error.toString(), Toast.LENGTH_LONG).show();

                        }
                    });

        //queue.add(JOR);
        JOR.setShouldCache(true);
        Entry entry = queue.getCache().get(url);
        if(entry!=null){
            Log.d("Cached", "CACHE Is Present!!");
             try {
                String data = new String(entry.data, "UTF-8"); Toast.LENGTH_LONG).show();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }else{
            queue.add(JOR);
            }

我正在使用处理缓存的 VolleySingleton。 条目 ALWAYS 似乎为空。我是否缺少任何代码。 我真正想要的只是让列表视图在没有网络连接时从缓存中检索数据。

【问题讨论】:

    标签: android caching android-volley


    【解决方案1】:

    凌空架构会为您解决这个问题。如果给定 URL 的响应已被 Volley L2 磁盘缓存缓存,则从 RequestQueue 请求 URL 将立即返回响应,而无需发送到网络。从概念上讲,您不应该手动检索 Volley 的缓存并查看它,因为这正是 Volley 在返回响应之前所做的。

    请注意:为了使我刚才描述的缓存起作用,有两个先决条件:

    1. 当您有网络连接时,您必须成功发出请求。这很明显 - 数据必须来自某个地方。
    2. Volley 的默认磁盘缓存根据HTTP 缓存标头 缓存每个响应(除非另有说明)。如果没有缓存标头/缓存标头已过期,则响应将在磁盘缓存中可用。

    旁注:通过 Volley 加载的图像也具有内存缓存的优势。

    可能的解决方案(按最佳优先排序):

    作为初步步骤:删除手动通过 Volley 缓存的代码。

    1. 无需进一步操作,因为您收到的 JSON 响应具有适当的缓存标头。
    2. JSON 响应没有任何缓存标头,但您可以控制服务器 - 将适当的缓存标头添加到响应中。
    3. 手动覆盖 Volley 源文件中的默认缓存策略以更好地满足您的需求,例如始终缓存所有内容/缓存特定 URL 等。
    4. 维护单独的磁盘/内存缓存并管理您自己的 JSON 响应缓存。这可能会导致重复缓存(您和 Volley 都将相同的 JSON 缓存在 2 个不同的位置),从而导致您的应用在设备内存中占用的磁盘空间量高达两倍。

    【讨论】:

    • 哦酷,我会试试这个。感谢您的回复,我已经放弃并使用了Sqlite数据库。
    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2013-07-15
    • 2023-03-29
    • 1970-01-01
    • 2018-04-18
    • 2013-10-24
    • 2014-03-17
    相关资源
    最近更新 更多