0

所以,我在 java 集合中缓存数据时遇到了问题。当我第一次初始化应用程序时,我像这样使用下面的函数,

cacheImageAndSounds(0,6);

现在,一旦我从一开始就到达第 4 个位置,我想从集合中删除前 3 个元素并缓存下一个 3,即

cacheImageAndSounds(4,10);

但由于我已经在缓存中拥有第 4、第 5 和第 6 个图像,我不想将它们重新放入缓存中,因为它们已经存在,因此我只想下载或获取第 7 到第 10 个图像和声音文件。

我该怎么做,或者我可以如何调整我在地图内缓存数据的算法?

这是我用来在集合中创建图像和声音文件的缓存并进一步使用它来根据各种索引值从中检索数据的函数。我以某种方式使用它,以便有意识地设置两个索引并在集合中填充所需的数据。

public int cacheImageAndSounds(int startIndex,int lastIndex)
    {
        for(int i=startIndex;i<lastIndex;i++)
        {   
        aq.ajax(data1.get(i), Bitmap.class, new AjaxCallback<Bitmap>() {
            @Override
            public void callback(String url, Bitmap object, AjaxStatus status) {
                imageFilexxS.put(url, object);
                System.out.println("size of imagefile"+imageFilexxS.size());
            }
        }); 

        aq.ajax(data1.get(i).replace(".png", ".mp3"), File.class, new AjaxCallback<File>() {
            @Override
            public void callback(String url, File object, AjaxStatus status) {
                imageFilexxSm.put(url, object);

                System.out.println("size of songfile"+imageFilexxSm.size());

                if(imageFilexxSm.size()>=6)
                {
                      update(); //call to the UI
                }
            }
        });
       }
      return 1;
    }

清除缓存并建立新的。

public void clearCacheLogic()
    {
        imageFilexxS.clear();
        imageFilexxSm.clear();
    }
4

1 回答 1

2

在进行 ajax 调用之前,您似乎没有缓存索引并对其进行检查有一个新的Set<Integer>processed. 像这样的方法,

public int cacheImageAndSounds(int startIndex,int lastIndex)
    {
        for(final int i=startIndex;i<lastIndex;i++)
        {   
            //check if the index is already processed, if not then make the call
            if(!processed.contains(i)) {
                aq.ajax(data1.get(i), Bitmap.class, new AjaxCallback<Bitmap>() {
                    @Override
                    public void callback(String url, Bitmap object, AjaxStatus status) {
                        imageFilexxS.put(url, object);
                        System.out.println("size of imagefile"+imageFilexxS.size());
                        processed.add(i); //once the result comes, mark the index as processed
                    }
                }); 

                aq.ajax(data1.get(i).replace(".png", ".mp3"), File.class, new AjaxCallback<File>() {
                    @Override
                    public void callback(String url, File object, AjaxStatus status) {
                        imageFilexxSm.put(url, object);
                        processed.add(i); //once the result comes, mark the index as processed
                        System.out.println("size of songfile"+imageFilexxSm.size());

                        if(imageFilexxSm.size()>=6)
                        {
                            update(); //call to the UI
                        }
                    }
                });
            }
        }
      return 1;
    }

这样,当您cacheImageAndSounds(4,10);为第 4、第 5 和第 6 个索引调用 时,将不会进行ajax 调用,因为这些索引已经存在于processedSet中

于 2013-05-13T07:49:02.170 回答