android – 告诉Volley不要使用缓存数据但是要发起新请求?

前端之家收集整理的这篇文章主要介绍了android – 告诉Volley不要使用缓存数据但是要发起新请求?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在应用程序中遇到了一个问题,我认为它可能与Volley从缓存中提取数据有关.

也就是说,应用程序与API紧密绑定,因此每次更改都会发送到API,然后使用Volley库从API中检索.因此,用户将打开一个弹出窗口,选择一些组来查看其项目,然后选择一些值来标记它的最爱.弹出窗口将关闭,片段将重新加载新数据.

用户再次打开弹出窗口时,选择相同的组来加载其数据,之前的项目将不会显示为收藏夹.但是当用户再次触摸同一组以重新加载其数据时,该项目将显示为收藏夹.

我已经逐步调试了代​​码,但没有发现任何错误.所以我得出结论,Volley可能会从其缓存中提取数据,同时在我第二次点击该组时启动新的API请求.

我想测试它是否是缓存问题或者我必须更深入地调试.

有没有办法告诉Volley不要使用缓存的请求数据,而是启动对API的新请求?像是不使用缓存数据,但提出新请求.

注意:我不想删除完整的缓存.我只想告诉Volley什么时候发起一个全新的API请求.

最佳答案
IMO,如果您的项目使用Google的排球作为模块(而不是jar文件),您可以自定义其类,如下所示:

选项1:

第一个文件,RequestQueue.java

添加一个类变量private boolean mCacheUsed = true;

以及以下构造函数

    public RequestQueue(Cache cache,Network network,int threadPoolSize,ResponseDelivery delivery,boolean cacheUsed) {
        mCache = cache;
        mNetwork = network;
        mDispatchers = new NetworkDispatcher[threadPoolSize];
        mDelivery = delivery;
        mCacheUsed = cacheUsed;
    }

    public RequestQueue(Cache cache,boolean cacheUsed) {
        this(cache,network,threadPoolSize,new ExecutorDelivery(new Handler(Looper.getMainLooper())),cacheUsed);
    }

    public RequestQueue(Cache cache,DEFAULT_NETWORK_THREAD_POOL_SIZE,cacheUsed);
    }

然后,在公共< T>内请求< T>添加(请求< T>请求){,您检查如下:

        // If the request is uncacheable,skip the cache queue and go straight to the network.
        if (!request.shouldCache() || !mCacheUsed) {
            mNetworkQueue.add(request);
            return request;
        }

第二个文件,Volley.java:

public static RequestQueue newRequestQueue(Context context,HttpStack stack,boolean cacheUsed) {
        File cacheDir = new File(context.getCacheDir(),DEFAULT_CACHE_DIR);

        String userAgent = "volley/0";
        try {
            String packageName = context.getPackageName();
            PackageInfo info = context.getPackageManager().getPackageInfo(packageName,0);
            userAgent = packageName + "/" + info.versionCode;
        } catch (NameNotFoundException e) {
        }

        if (stack == null) {
            if (Build.VERSION.SDK_INT >= 9) {
                stack = new HurlStack();
            } else {
                // Prior to Gingerbread,HttpUrlConnection was unreliable.
                // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
                stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
            }
        }

        Network network = new BasicNetwork(stack);

        RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir),cacheUsed);
        queue.start();

        return queue;
    }

public static RequestQueue newRequestQueue(Context context,boolean cacheUsed) {
        return newRequestQueue(context,null,cacheUsed);
    }

最后,在MainActivity中,例如:

如果要使用可用缓存:

RequestQueue requestQueue = Volley.newRequestQueue(this,true); 

如果不想使用可用缓存:

RequestQueue requestQueue = Volley.newRequestQueue(this,false); 

选项#2:

Request.java:

添加一个类变量public boolean mSkipAvailableCache = false;

RequestQueue.java:

公共内部< T>请求< T>添加(请求< T>请求),skip the cache queue and go straight to the network. if (!request.shouldCache() || request.mSkipAvailableCache) { mNetworkQueue.add(request); return request; }

MainActivity.java:
你可以设置

jsonArrayRequest.mSkipAvailableCache = true;

不会使用可用的缓存.
希望这可以帮助!

猜你在找的Android相关文章