Я не могу правильно получить доступ к кэшированным изображениям в автономном режиме - PullRequest
0 голосов
/ 29 февраля 2012

Я использую AQuery , чтобы помочь кэшировать некоторые изображения.Я точно знаю, что изображения кэшируются правильно, но у меня возникают проблемы с доступом к ним, если я не в сети.

Я знаю, что они кэшируются, потому что я могу видеть их на моей SD-карте, и если я заменю mArtistImageURL в своем выражении возврата на URL из моего браузера (копировать / вставить), изображение будет загружаться, пока яЯ в автономном режиме, если он уже кешируется.Я понимаю, что запрашиваю получение URL-адресов изображений только в том случае, если я в сети, но даже в этом случае я не понимаю, почему кэшированные изображения не будут загружаться в автономном режиме.

MusicUtils.isOnline() в основномпроверьте, есть ли какая-либо связь.Основная причина, по которой я заключил в себе основную часть моего doInBackground() метода, - это сделать исключение, которое выдается, если я этого не сделаю.FATAL EXCEPTION: AsyncTask #1 - это все, что Logcat выпускает для меня в данный момент.Я не уверен, почему трассировка стека не завершена.

Я пытался использовать мой AsyncTask всеми возможными способами.Я вернул Bitmap, File и String, и я могу успешно загрузить изображение в каждом случае, пока я в сети.Итак, у меня есть эти кэшированные изображения, и мне нужна помощь в их использовании.

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 Ответ

1 голос
/ 29 февраля 2012

Мм. В автономном режиме какое значение будет иметь значение mArtistImageURL? Ноль? Итак, в этот момент aq.cache(mArtistImageURL, 60000 * 1440); вы кешируете ноль, а на следующей строке вы пытаетесь получить кеш для нуля? Я прав?

Обновление: я предполагаю, что вы кэшируете изображения, используя значение хэша url для имени файла или что-то вроде этого. Таким образом, измените метод кэширования, чтобы он принимал дополнительный параметр для имени файла, например aq.cache(mArtistImageURL,mArtistNameWithoutSpaces, 60000 * 1440);, и когда вы хотите, чтобы файл был отключен, просто вызовите aq.getCachedImage(mArtistNameWithoutSpaces);, чтобы он посмотрел на вашу папку кэша и возвратил нужный файл, или заглушки, если файл отсутствует найдено.

Обновление 2: хорошо, если вы не хотите изменять методы кэширования AQuery, вы можете попробовать (снова), используя общие настройки (чтобы они работали), например (не проверено):

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, но в любом случае вам, вероятно, следует кэшировать изображения только в режиме онлайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...