6

このメモをどのように理解しますか

:たとえば、画像ギャラリーアプリケーションなどで頻繁にアクセスされる場合は、キャッシュされた画像を保存するのにContentProviderが適している場合があります。

このトレーニング記事https://developer.android.com/training/displaying-bitmaps/cache-bitmap.htmlBitmap取得またはFile取得できないのでCursor、ContentProviderを介してビットマップをキャッシュするにはどうすればよいですか?

4

3 に答える 3

3

実際には、ContentProviderを使用してファイルの読み取りと書き込みを行うことができます。

独自のContentProviderでこれをサポートするには、サポートされているファイルMIMEタイプをgetStreamTypes()メソッドに含める必要があります。詳細については、AndroidContentProviderチュートリアルのMIMEタイプのセクションを確認してください

また、 openFile(Uri uri、String mode)メソッドを実装する必要があります。このメソッドでは、ContentResolverに提供されたUriに基づいてFileディレクトリと名前を実際に選択します。そのメソッドのサンプル実装は次のとおりです。

  @Override
  public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
      File root = getContext().getFilesDir();
      File path = new File(root, uri.getEncodedPath());
      path.mkdirs();
      File file = new File(path, "file_"+uri.getLastPathSegment());

      int imode = 0;
      if (mode.contains("w")) {
        imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
        if (!file.exists()) {
          try {
            file.createNewFile();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
      if (mode.contains("r"))
        imode |= ParcelFileDescriptor.MODE_READ_ONLY;
      if (mode.contains("+"))
        imode |= ParcelFileDescriptor.MODE_APPEND;

      return ParcelFileDescriptor.open(file, imode);
  }

ここで必要なロジックを使用して、ファイルディレクトリを選択できます。このコードはアプリケーションファイルディレクトリを使用するだけですが、ビットマップキャッシュの目的では、おそらく一時キャッシュディレクトリを使用する必要があります。

最後に、ContentProviderファイルデータにアクセスするためのコードは次のようになります。

ContentResolver cr = getContext().getContentResolver();
InputStream inputStream = cr.openInputStream(uri);

または、 ContentResolver.openOutputStream(uri)を使用してファイルデータをContentProviderに書き込みます。

ビットマップキャッシングチュートリアルでは、ContentProviderをディスクキャッシュとして使用するためにかなりの変更が必要になりますが、これがそのメモが参照していたものであると私は信じています。

于 2013-02-22T23:43:56.817 に答える
1

https://github.com/nostra13/Android-Universal-Image-Loader画像のダウンロードとキャッシュにはライブラリを使用することを強くお勧めします

ライブラリは、Androidプロジェクトに簡単に含めることができるJARファイルとしてダウンロードできます。

公式ページの機能:

->マルチスレッド画像の読み込み

-> ImageLoaderの構成を幅広く調整する可能性(スレッドプールサイズ、HTTPオプション、メモリとディスクキャッシュ、画像表示オプションなど)

->メモリおよび/またはデバイスのファイルシステム(またはSDカード)での画像キャッシュの可能性

->読み込みプロセスを「聞く」可能性

->個別のオプションを使用してすべての表示画像呼び出しをカスタマイズする可能性ウィジェットのサポート

于 2012-11-08T10:15:53.823 に答える
0

前述の箇所では、要求されたときにすべてのデータを検索して処理するのではなく、データにサイレントインデックスを付け、プレビュー(画像のサムネイル、または最初の2行)を保存する別のコンテンツモデルを実装する(または組み込みのモデルを使用する)方がよいことを強調しています。ディスク上のテキストファイルなど)。これにより、次のことが実現します。

  1. 前処理されたデータがディスク上で準備ができているため、使用されるRAMが少なくなります。たとえば、非常に長いList view場合は、すべてのプレビューDrawableを一度にメモリにロードする必要はありません。スクロール時に、コンテンツモデル/プロバイダーからメモリ内キャッシュに小さなバッチでキャッシュされたデータを要求する場合があります。

  2. CPUを節約します。インメモリキャッシュは揮発性であり、再度再作成する必要がありますが、ディスクキャッシュではこの余分な処理から私たちを救います。

于 2012-11-08T10:39:24.250 に答える