1

Jake Wharton の LRU ディスク キャッシュを使用して、ListView に表示されるビットマップを格納および取得しています。同じアクティビティ内からビットマップを保存してアクセスする限り、これは正常に機能します。ただし、アプリ内の他のアクティビティからキャッシュにアクセスしようとすると (つまり、同じ画像を 2 回ダウンロードする必要がなくなります)、NullPointerException が発生します。ここで何か不足していますか?これは、ファイルが削除される/削除されるメモリキャッシュではありません。内部ストレージ内の正しいディレクトリを指している限り、アプリ内のすべてのアクティビティからディスク キャッシュにアクセスできるようにすべきではありませんか?

01-14 22:53:44.465: E/AndroidRuntime(10720): java.lang.NullPointerException
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Matcher.reset(Matcher.java:181)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Matcher.<init>(Matcher.java:94)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.util.regex.Pattern.matcher(Pattern.java:290)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruCache.validateKey(DiskLruCache.java:629)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruCache.get(DiskLruCache.java:375)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.DiskLruImageCache.containsKey(DiskLruImageCache.java:145)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment.getMessages(ChatroomFragment.java:309)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment.access$3(ChatroomFragment.java:284)
01-14 22:53:44.465: E/AndroidRuntime(10720): at com.example.echofriendly.ChatroomFragment$2.run(ChatroomFragment.java:94)
01-14 22:53:44.465: E/AndroidRuntime(10720): at java.lang.Thread.run(Thread.java:1019)
4

3 に答える 3

1

内部ストレージ内の適切なディレクトリを指している限り、アプリ内のすべてのアクティビティからディスク キャッシュにアクセスできるべきではありませんか?

必要なすべてのアクティビティでキャッシュをインスタンス化しているようです。それは良い考えだとは思いません。Jake の LruCache はジャーナルを使用するため、私の意見では、同じディレクトリで動作するさまざまなインスタンスが互いに気を散らす可能性があります。

私の提案は、アクティビティとキャッシュの間のレイヤーとして、またはアプリケーション全体の正確に 1 つのキャッシュ インスタンスへの参照を格納するために、ある種のシングルトンを導入することです。

さらに、ディスクキャッシュと組み合わせた memcache など、ある種の 2 レベルのキャッシュを使用することをお勧めします (これは私のアプリで行っていることです)。そのため、最初に memcache を確認し、そこにキャッシュされている場合はイメージを非常に高速に取得できます。(同期することができます) そこにない場合は、ディスクキャッシュに問い合わせます。(非同期である必要があります)そして、最後の呼び出しとしてダウンロードします。(非同期も)

于 2013-01-14T19:18:29.453 に答える
0

アクティビティがクリーンアップされるときに、キャッシュが破棄される可能性があります。このようなクリーンアップ呼び出しについては、ライブラリ内のコールバックを確認してください。

于 2013-01-14T18:44:32.857 に答える
0

同じ問題があります。同じキャッシュを使用する複数のアクティビティです。2 つの問題が発生します: - キャッシュは削除されませんでした...その理由は 2 番目のポイントだと思います - アクティビティ B がアクティビティ A の後に呼び出された場合: - アクティビティ B が起動され、キャッシュが開かれました (ただし、アクティビティ A はキャッシュを閉じません)まだ !) - アクティビティ A は onStop() メソッドでキャッシュを閉じます...一方、B はキャッシュを開きました...

そして私の解決策は、アクティビティごとに 1 つのキャッシュ ディレクトリを提供することでした。

// retrieve the name of the activity
String nameActivity = ModelActivity.getCurrentActivity().getClass().getSimpleName();

// set the cache directory with a name related to the activity
    DiskLruImageCache imageDiskCache = new DiskLruImageCache(ModelActivity.getCurrentContext(), 
                        "cacheMediaActivity"+nameActivity, 
                        DISK_CACHE_SIZE, 
                        CompressFormat.JPEG, 
                        70);

そして、それは私のために働きます!

于 2013-02-07T21:28:02.917 に答える