プロジェクトの1つでGlideを使用して、ファイルから画像を表示しています。
以下は、私がどのように画像を表示するかを示すコードです。
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.into(mImage);
この場所(imagePath
)の画像は変化し続けます。デフォルトでは、GlideはImageView
に表示される画像をキャッシュします。このため、Glideはその場所での新しい画像のキャッシュからの最初の画像を表示していました。
ロケーションimagePath
の画像を同じ名前の他の画像に変更すると、Glideは新しい画像ではなく最初の画像を表示します。
2つのクエリは次のとおりです。
キャッシュではなく、常にファイルから画像を取得することは可能ですか?この方法で問題は解決されます。
新しく置き換えられた画像を取得する前に、キャッシュから画像をクリアすることは可能ですか?これも問題を解決します。
これが私がこの問題を解決した方法です。
方法1:画像が変わるたびにURLが変わるとき
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(mImage);
diskCacheStrategy()を使用してディスクキャッシュを処理し、skipMemoryCache()メソッドを使用してメモリキャッシュをスキップできます。
方法2:URLが変わらない場合、画像が変わる
URLが一定の場合、画像キャッシュに署名を使用する必要があります。
Glide.with(yourFragment)
.load(yourFileDataModel)
.signature(new StringSignature(yourVersionMetadata))
.into(yourImageView);
Glide signature()は、追加データとキャッシュキーを混合する機能を提供します。
MediaStoreSignature
を使用できます。 MediaStoreSignature
を使用すると、メディアストアアイテムの変更日時、MIMEタイプ、および向きをキャッシュキーに混在させることができます。これらの3つの属性は、編集と更新を確実にキャッチして、メディアストアのサムをキャッシュできるようにします。StringSignature
を使用して、ファイルの変更日時を混在させることもできます。Glide wikiのセクション Caching and Cache Invalidation で説明されているように:
ファイル名はハッシュキーであるため、特定のURLまたはファイルパスに対応するディスク上のキャッシュされたファイルをすべて削除するのに良い方法はありません。元の画像の読み込みまたはキャッシュのみが許可されている場合、問題はより単純になりますが、Glideはサムネイルもキャッシュしてさまざまな変換を提供するため、それぞれがキャッシュ内の新しいファイルになり、すべてのキャッシュバージョンを追跡して削除します画像の.
実際には、キャッシュファイルを無効にする最良の方法は、コンテンツ(URL、URI、ファイルパスなど)が変更されたときに識別子を変更することです。
ファイルパスを変更できないため、Glideは signature() APIを提供します。このAPIを使用すると、メモリとディスクキャッシュキーに追加データを混在させて、呼び出し元がキャッシュされるタイミングをより細かく制御できます。データは無効になります。
ディスクからイメージを毎回リロードする場合は、次のようにコードを変更できます。
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
.into(mImage);
これにより、Glideによって保存されているキャッシュメモリが削除されます。バックグラウンドで実行する必要があります。そうしないと、例外がスローされます。
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(MainActivity.this).clearDiskCache();
}
}).start();
Glideキャッシュの更新を処理するには2つの方法があります。
Firstway:-グライド実装で以下を追加
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
2番目の方法:
画像の変更を特定できる場合は、新しいファイル名を下に入力してください。
.signature(new StringSignature(String.valueOf(fileName)))
または、最新の画像を毎回ロードする場合は、以下を使用します
.signature(new StringSignature(String.valueOf(System.currentTimeMillis())))
お役に立てれば。
Glide 4.2.0で問題が発生した場合、StringSignature
は解決されませんでした。
StringSignature
は使用できなくなったため、代わりにObjectKey
を使用する必要があります。
コードは次のようになります
Glide.with(imageView).
load(pathToImage).
apply(new RequestOptions().signature(new ObjectKey("signature string"))).
into(imageView);
慣例として同じ既知のファイル名に画像を保存し、ファイルが変更されたときにのみGlideキャッシュを無効にしたい場合、ファイル変更タイムスタンプを使用するとうまく機能します。
私はGlideの外のFile
オブジェクトにダウンロードしていたアバター画像にこのような規則を使用していました。その後、Glideを使用して効率的にサイズを変更して丸くしました。
そのため、ファイルのlastChangedタイムスタンプの値を署名としてStringSignature
戦略を使用することになりました。そのための流れるようなコードは次のようになります。
Glide.with(this)
.load(avatarFile)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.signature(new StringSignature(String.valueOf(avatarFile.lastModified())))
.into(ivProfile);
}
もちろん、avatarFile
は私のJava.io.File
オブジェクトです。
KotlinでGlideバージョン4. *を使用して署名を設定するのに問題がありました。しばらくして、私はこれで終わりました:
fun ImageView.loadUrl(url: String) {
var requestOptions = RequestOptions()
requestOptions.signature(ObjectKey(System.currentTimeMillis()))
Glide.with(this).load(url).apply(requestOptions).into(this)
}
ImageViewの拡張関数であり、次のように使用されます。
imageView.loadUrl(url)
私はそれが誰かを助けることを願っています
Glide 4.3。+ライブラリの場合、次のようにする必要があります。
Glide.with(context)
.load(image_path)
.apply(new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true))
.into(imge_view);
最新バージョンでは、RequestOptionsを使用する必要があります
RequestOptions Glideの最新バージョンのGlideで荷重をカスタマイズするためのタイプに依存しないオプションを提供します。
RequestOptionsオブジェクトを作成し、画像を読み込むときに使用します。
RequestOptions requestOptions = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE) // because file name is always same
.skipMemoryCache(true);
Glide.with(this)
.load(photoUrl)
.apply(requestOptions)
.into(profile_image);
glideAppによる署名
GlideApp.with(imageView)
.load(url)
.signature(new ObjectKey(System.currentTimeMillis()))
.placeholder(R.drawable.sky)
.error(R.drawable.sky)
.into(imageView);
最後に、Kotlinの実装(フラグメント用):
Glide.with(activity)
.load(url)
.apply(RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true))
.into(myImageView)
これは私のために働いた
//use diskCacheStrategy(DiskCacheStrategy.NONE) after skipMemoryCache(true)
Glide.with(this)
.load(image)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageview);
Glideが提供するキャッシュを活用して、常に正しい画像が表示されるようにするには、 signature()API を使用できます。
画像ファイルに関連する情報を署名として設定するだけです。そのファイルを置き換えると、情報も変更され、Glideはそれをリロードする必要があることを認識し、キャッシュを無視します。
有効な情報は、ファイルのコンテンツで計算されたダイジェスト(SHA-1など)です。
Glide.with(context)
.load(inputFile)
.signature(new StringSignature(sha1(inputFile)))
.into(targetImageView);
ここ sha1()関数の次の実装が見つかりました。
public static String sha1(final File file) throws NoSuchAlgorithmException, IOException {
final MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
try (InputStream is = new BufferedInputStream(new FileInputStream(file)) {
final byte[] buffer = new byte[1024];
for (int read = 0; (read = is.read(buffer)) != -1;) {
messageDigest.update(buffer, 0, read);
}
}
// Convert the byte to hex format
try (Formatter formatter = new Formatter()) {
for (final byte b : messageDigest.digest()) {
formatter.format("%02x", b);
}
return formatter.toString();
}
}
これは私のために働いた!
Glide.with(DemoActivity.this)
.load(Uri.parse("file://" + imagePath))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(mImage);
Glideを使用してFile
をロードしていましたが、ファイルが変更されるたびに(同じパスであっても)Glideのディスクキャッシュが無効になるようにするために、次のようにしました。
Glide.with(context)
.load(bitmapFile)
.signature(new ObjectKey(bitmapFile.lastModified()))
.into(imageView);