2012-02-29 4 views
0

私はAQueryを使用していくつかの画像をキャッシュしています。私は画像が正しくキャッシュされているという事実を知っていますが、私がオンラインになっていなければアクセスできません。オフラインでキャッシュされた画像に正しくアクセスできません。

SDカードで見ることができるためキャッシュされていることがわかっています。返信文のmArtistImageURLをブラウザ(コピー/ペースト)のURLに置き換えると、すでにキャッシュされている場合私がオンラインの場合にのみイメージURLを取得するよう要求していますが、キャッシュされたイメージがオフラインで読み込まれない理由はわかりません。

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

ミリメートル。オフラインの間、mArtistImageURLの値はどのようになりますか?ヌル?だからこの時点でaq.cache(mArtistImageURL, 60000 * 1440);あなたはnullをキャッシュしています、そして、次の行であなたはnullのためのキャッシュを取得しようとしていますか?私は正しい?

アップデート:ファイル名などのURLハッシュ値を使用してイメージをキャッシュするとします。したがって、キャッシュメソッドを変更してfilenameの追加パラメータを受け入れるようにします(例:aq.cache(mArtistImageURL,mArtistNameWithoutSpaces, 60000 * 1440);)。ファイルをオフラインにする場合は、aq.getCachedImage(mArtistNameWithoutSpaces);を呼び出して、キャッシュフォルダを探して正しいファイルを返します。ファイルが見つからない場合はスタブイメージを返します。

アップデート2:中のSO

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(); 
} 

:あなたはAQueryキャッシュ方式を変更したくない場合さて、あなたはこのような共有設定を(そう、彼らは動作します)(テストしていません)を使用して(againg)試すことができますあなたのコードは次のようになります終了:

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を取得するために使用しているメソッドによってスローされた例外をキャッチする必要があります。そうしないと、強制的に閉じます。アドバイスはありますか? – adneal

+0

アーティストごとに1つの画像が好きですか? – Sver

+0

私はあなたが言っていることを理解していますが、最初に取得するためにオンラインにする必要がある場合、 'getImageUrlOrFilenameWhileOffline()'メソッドは正しい画像URLを返すことができますか? – adneal

関連する問題