2012-02-29 57 views
0

我正在使用AQuery來幫助緩存某些圖像。事實上,我知道圖像緩存正確,但我無法訪問它們,除非我在線。我無法在離線時正確訪問緩存圖像

我知道它們正在被緩存,因爲我可以在SD卡上看到它們,如果我將我的返回語句中的mArtistImageURL替換爲來自瀏覽器的URL(複製/粘貼),圖像將在我離線時加載,如果它已被緩存。我意識到,我只是要求在我上線的情況下才能獲取圖片網址,但即便如此,我也不明白爲什麼緩存的圖片無法加載離線。

MusicUtils.isOnline()基本上是檢查是否有任何連接。我的大部分方法都包含在我的doInBackground()方法中,主要原因是如果我不這樣做,拋出異常。目前全部是Logcat正在爲我推出的FATAL EXCEPTION: AsyncTask #1。我不知道爲什麼堆棧跟蹤不完整。

我試過用我認識的各種方式使用我的AsyncTask。我已經返回了Bitmap,FileString,並且我可以在每種情況下都成功加載圖像,只要我在線。所以,我有這些緩存的圖像,我需要一些幫助使用它們。

的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

毫米。離線時,mArtistImageURL的價值是什麼?空值?所以在這一點aq.cache(mArtistImageURL, 60000 * 1440);你正在緩存空,並在下一行你試圖讓緩存爲空?我對嗎?

更新:我想你緩存圖像使用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的行爲,但無論如何,你應該只緩存圖像,同時在線。

+0

是的,我意識到這一點,你說得對。事情是,我不知道如何去做這件事。我無法在離線狀態下想辦法維護網址的價值。我試過'SharedPreferences',但他們從來沒有工作。我必須捕捉我在離線時用於獲取圖像URL的方法所拋出的異常,否則當然會強制關閉。你有什麼建議嗎? – adneal 2012-02-29 05:11:03

+0

你喜歡每個藝術家1個圖像,對吧? – Sver 2012-02-29 05:15:40

+0

我明白你在說什麼,但是如果我需要首先在線抓取它,那麼getImageUrlOrFilenameWhileOffline()是什麼方法可以返回正確的圖像URL? – adneal 2012-02-29 05:18:39