Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android drawing cache

Tags:

android

view

Please explain how does the drawing cache work in Android. I'm implementing a custom View subclass. I want my drawing to be cached by the system. In the View constructor, I call

setDrawingCacheEnabled(true);

Then in the draw(Canvas c), I do:

    Bitmap cac = getDrawingCache();
    if(cac != null)
    {
        c.drawBitmap(cac, 0, 0, new Paint());
        return;
    }

Yet the getDrawingCache() returns null to me. My draw() is not called neither from setDrawingCacheEnabled(), nor from getDrawingCache(). Please, what am I doing wrong?

like image 762
Seva Alekseyev Avatar asked Jun 15 '10 15:06

Seva Alekseyev


People also ask

Is drawing cache enabled deprecated?

getDrawingCache() has been deprecated.

What is image caching in Android?

The bitmap cache stores decoded images as Android Bitmap objects. These are ready for display or postprocessing. On Android 4. x and lower, the bitmap cache's data lives in the ashmem heap, not in the Java heap. This means that images don't force extra runs of the garbage collector, slowing down your app.

How do I cache on Android?

How caching works? The first time, the user opens the app, there will be no data in memory and no data in the disk cache. So the application will have to make a network call to fetch the data. It will fetch the data from the network and save it to the disk, keep it in the memory cache and return the data.

What is Image Manager disk cache?

A disk cache can be used in these cases to persist processed bitmaps and help decrease loading times where images are no longer available in a memory cache. Of course, fetching images from disk is slower than loading from memory and should be done in a background thread, as disk read times can be unpredictable.


2 Answers

There's a hard limit on drawing cache size, available via the ViewConfiguration class.. My view is larger than allowed for caching.

FYI, the sources of the View class are available via the SDK Manager for some (not all) Android versions.

like image 72
Seva Alekseyev Avatar answered Sep 21 '22 12:09

Seva Alekseyev


Hopefully this explains it.

public class YourCustomView extends View {

    private String mSomeProperty;

    public YourCustomView(Context context) {
        super(context);
    }

    public YourCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public YourCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setSomeProperty(String value) {
        mSomeProperty = value;
        setDrawingCacheEnabled(false); // clear the cache here
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // specific draw logic here

        setDrawingCacheEnabled(true); // cache
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        ...
    }

}

Example code explained.

  1. In the setSomeProperty() method call setDrawingCacheEnabled(false) to clear the cache and force a redraw by calling invalidate().
  2. Call setDrawingCacheEnabled(true) in the onDraw method after drawing to the canvas.
  3. Optionally place a log statement in the onDraw method to confirm it is only called once each time you call the setSomeProperty() method. Be sure to remove the log call once confirmed as this will become a performance issue.
like image 44
Gavin Saunders Avatar answered Sep 20 '22 12:09

Gavin Saunders