我无法在离线时正确访问缓存的图像

时间:2012-02-29 04:37:53

标签: java android caching android-asynctask

我正在使用AQuery来帮助缓存一些图片。我知道事实上图像正在被正确缓存,但除非我在线,否则我无法访问它们。

我知道他们正在被缓存,因为我可以在我的SD卡上看到它们,如果我用我的浏览器中的URL(复制/粘贴)替换我的return语句中的mArtistImageURL,那么图像将在我加载时加载离线,如果它已经缓存。我知道我只是在网上请求获取图片网址,但即便如此,我也不明白为什么缓存的图片不会离线加载。

MusicUtils.isOnline()基本上是检查是否有任何连接。我拥有大量doInBackground()方法的主要原因是如果不这样做就抛出异常。 FATAL EXCEPTION: AsyncTask #1是Logcat目前为我推出的全部内容。我不确定为什么堆栈跟踪不完整。

我尝试过以我认识的各种方式使用AsyncTask。我已经返回了BitmapFileString,只要我在线,我就可以在每种情况下成功加载图像。所以,我有这些缓存的图像,我需要一些帮助才能使用它们。

的AsyncTask

    public class loadArtistImage extends AsyncTask<String, Integer, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... arg0) {
        // Get artist image
        if (MusicUtils.isOnline(mContext)) {
            mArtistResults = Artist.getImages("Andrew Bird", 1, 1, key);
            mArtistIterator = mArtistResults.getPageResults().iterator();
            while (mArtistIterator.hasNext()) {
                mArtistImageURL = mArtistIterator.next().getImageURL(
                        ImageSize.ORIGINAL);
            }
        }
        aq.cache(mArtistImageURL, 60000 * 1440);
        return aq.getCachedImage(mArtistImageURL);
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        bm = result;
        if (bm!= null) {
            mArtistImage.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mArtistImage.startAnimation(AnimationUtils
                            .loadAnimation(mContext, android.R.anim.fade_in));
                    MusicUtils.setArtistBackground(mArtistImage, bm);
                }
            }, 666);
        } else {
            // TODO something
        }
        super.onPostExecute(result);
    }
}

1 个答案:

答案 0 :(得分:1)

毫米。离线时mArtistImageURL的值是多少?空值?所以此时aq.cache(mArtistImageURL, 60000 * 1440);你正在缓存null,而在下一行你试图获取null的缓存?我是对的吗?

更新:我想您使用文件名的url哈希值或类似的东西来缓存图像。因此,修改您的缓存方法以接受文件名的其他参数,例如aq.cache(mArtistImageURL,mArtistNameWithoutSpaces, 60000 * 1440);,当您希望文件脱机时,只需调用aq.getCachedImage(mArtistNameWithoutSpaces);,这样它将查看您的缓存文件夹并返回正确的文件或存根如果没有找到文件,则显示图像。

更新2:好的,如果你不想修改AQuery缓存方法,你可以尝试(againg)使用共享首选项(因此它们可以工作)像这样(未经测试):

public String getUrlForArtist(String artistName) {
        SharedPreferences settings = mContext.getSharedPreferences(
                "artistImages", 0);
        return settings.getString(artistName, "http://default.url");
    }

public void setUrlForArtist(String artistName, String url) {
        SharedPreferences settings = mContext.getSharedPreferences(
                "artistImages", 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(artistName, url);
        editor.commit();
}

所以最后你的代码看起来像这样:

if (MusicUtils.isOnline(mContext)) {
            mArtistResults = Artist.getImages("Andrew Bird", 1, 1, key);
            mArtistIterator = mArtistResults.getPageResults().iterator();
            while (mArtistIterator.hasNext()) {
                mArtistImageURL = mArtistIterator.next().getImageURL(
                        ImageSize.ORIGINAL);
            if(mArtistImageURL!=null)
             setUrlForArtist("Andrew Bird", mArtistImageURL);
            }
        } else
              mArtistImageURL = getUrlForArtist("Andrew Bird");

哦,是的,我不知道AQuery的行为,但无论如何你可能只应该在线时缓存图像。