2012-02-29 2 views
0

AQuery을 사용하여 일부 이미지를 캐시하는 데 도움이됩니다. 사실 이미지가 올바르게 캐싱되고 있음을 알고 있지만 온라인 상태가 아니면 이미지에 액세스하는 데 문제가 있습니다.오프라인 상태에서 캐시 된 이미지에 올바르게 액세스 할 수 없습니다.

내 SD 카드에서 볼 수 있기 때문에 캐시되고 있다는 것을 알고 있습니다. 브라우저 (복사/붙여 넣기)의 URL로 내 return 문을 mArtistImageURL으로 바꾸면 이미지가 오프라인 일 때로드됩니다. 이미 캐시 된 경우. 온라인 상태 일 때만 이미지 URL을 가져 오라고 요청하고 있지만 캐시 된 이미지가 오프라인으로로드되지 않는 이유는 모르겠다.

MusicUtils.isOnline() 기본적으로 어떤 연결이 있는지 확인합니다. 가장 큰 이유는 내 doInBackground() 메서드의 포장이 예외가 던져 예외가 할 경우 않습니다. FATAL EXCEPTION: AsyncTask #1는 모두 Logcat이 나에게 내놓은 순간입니다. stacktrace가 완료되지 않은 이유는 확실하지 않습니다.

제가 알고있는 모든면에서 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); 당신은 null을 캐싱하고, 다음 라인에서 당신은 null을위한 캐시를 얻으려고합니까? 내가 맞습니까?

업데이트 : 파일 이름 등의 URL 해시 값을 사용하여 이미지를 캐시한다고 가정 해 보겠습니다. 따라서 캐시 방법을 수정하여 filename에 대한 추가 매개 변수 (예 : aq.cache(mArtistImageURL,mArtistNameWithoutSpaces, 60000 * 1440);)를 허용하고 파일을 오프라인으로 만들려면 aq.getCachedImage(mArtistNameWithoutSpaces);을 호출하면 캐시 폴더를보고 올바른 파일을 반환하거나 파일을 찾을 수없는 경우 스텁 이미지를 반환합니다.

업데이트 2 : 당신은 당신이 공유 환경 설정을 사용하여 (againg) 시도 할 수 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가 작동하는 방법을 잘 모릅니다 만, 어쨌든 아마 단지 캐시 이미지해야 온라인 상태.

+0

그래, 나는 이것을 깨닫는다, 네 말이 맞아. 문제는 이것에 대해 어떻게 생각해야할지 모르겠습니다. 오프라인 일 때 URL 값을 유지하는 방법을 생각할 수 없습니다. 'SharedPreferences'를 시도했지만 결코 작동하지 않았습니다. 내가 오프라인 일 때 이미지 URL을 가져 오는 데 사용하는 메서드에 의해 throw 된 Exception을 잡아야합니다. 그렇지 않으면 강제로 닫힙니다. 조언 있니? – adneal

+0

아티스트마다 1 개의 이미지가 있습니다. 맞습니까? – Sver

+0

당신이 말하는 것을 이해하고 있지만, 처음에 그것을 잡으려면 온라인에 있어야 할 때'getImageUrlOrFilenameWhileOffline()', 어떤 메소드가 올바른 이미지 URL을 반환 할 수 있습니까? – adneal

관련 문제