1

私はdeveloper.android.comでURLからビットマップをキャッシュするチュートリアルを読んでいました

コードを参照する

    private LruCache<String, Bitmap> mMemoryCache;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        // Get memory class of this device, exceeding this amount will throw an
        // OutOfMemory exception.
        final int memClass = ((ActivityManager) context.getSystemService(
                Context.ACTIVITY_SERVICE)).getMemoryClass();

        // Use 1/8th of the available memory for this memory cache.
        final int cacheSize = 1024 * 1024 * memClass / 8;

        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in bytes rather than number of items.
                return bitmap.getByteCount();
            }
        };
        ...
    }

    public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemCache(key) == null) {
            mMemoryCache.put(key, bitmap);
        }
    }

    public Bitmap getBitmapFromMemCache(String key) {
        return mMemoryCache.get(key);
    }

public void loadBitmap(int resId, ImageView imageView) {
    final String imageKey = String.valueOf(resId);

    final Bitmap bitmap = getBitmapFromMemCache(imageKey);
    if (bitmap != null) {
        mImageView.setImageBitmap(bitmap);
    } else {
        mImageView.setImageResource(R.drawable.image_placeholder);
        BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
        task.execute(resId);
    }
}

アクティビティキャッシュでは、初期化は正常であり、2つの方法があります

  1. addBitmapToMemoryCache(String key, Bitmap bitmap)

  2. getBitmapFromMemCache(String key)

これがBitmapWorkerTaskクラスです

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    ...
    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        final Bitmap bitmap = decodeSampledBitmapFromResource(
                getResources(), params[0], 100, 100));
        addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
        return bitmap;
    }
    ...
}

今私の質問は、BitmapWorkerTaskクラスでメソッドaddBitmapToMemoryCache(String.valueOf(params [0])、bitmap);がどうして来るのかということです。Activtyで定義されているメソッド、または他のクラスにある可能性のあるメソッドへの参照を持って呼び出されます

4

2 に答える 2

2

BitmapWorkerTaskはおそらくアクティビティ内の内部クラスであるため、定義されたメソッドへのアクセスを提供します。

于 2013-01-04T06:39:57.917 に答える
0

それでもサンプルコードを機能させることができなかった人のために、

コードを機能させるには、BitmapWorkerTaskクラスを内部クラスにしてから、その2つの静的関数を変更する必要があります。

public  static int calculateInSampleSize()
public  static Bitmap decodeSampledBitmapFromResource()

通常の(静的でない)メソッドへ

于 2013-08-01T16:55:32.550 に答える