Skip to content

Commit

Permalink
Merge pull request #379 from MisterRager/expose-bitmap-recycle
Browse files Browse the repository at this point in the history
Feature Request: Expose API For Capturing Bitmaps On Tile#reset
  • Loading branch information
p-lr authored Dec 6, 2016
2 parents a147a85 + 5091295 commit ecdb013
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 3 deletions.
13 changes: 13 additions & 0 deletions tileview/src/main/java/com/qozix/tileview/TileView.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.qozix.tileview.detail.DetailLevelManager;
import com.qozix.tileview.geom.CoordinateTranslater;
import com.qozix.tileview.geom.FloatMathHelper;
import com.qozix.tileview.graphics.BitmapRecycler;
import com.qozix.tileview.graphics.BitmapProvider;
import com.qozix.tileview.hotspots.HotSpot;
import com.qozix.tileview.hotspots.HotSpotManager;
Expand Down Expand Up @@ -287,6 +288,18 @@ public void setBitmapProvider( BitmapProvider bitmapProvider ) {
mTileCanvasViewGroup.setBitmapProvider( bitmapProvider );
}

/**
* Sets a custom class to perform the Bitmap finalization on Tile#reset.
* By default, a BitmapRecycler implementation is provided that calls Bitmap#recycle, but
* alternative implementations could be used that recycle Bitmap instances to prevent garbage
* collection or do other things after the Bitmap is no longer needed for rendering.
*
* @param bitmapRecycler A class instance that implements BitmapRecycler and must define a recycleBitmap method, which accepts a Bitmap after it is no longer being used
*/
public void setBitmapRecycler( BitmapRecycler bitmapRecycler ) {
mTileCanvasViewGroup.setBitmapRecycler( bitmapRecycler );
}

/**
* Defines whether tile bitmaps should be rendered using an AlphaAnimation
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.qozix.tileview.graphics;

import android.graphics.Bitmap;

/**
* This interface represents the final operations applied to a {@link Bitmap} owned by a
* {@link com.qozix.tileview.tiles.Tile} after it is no longer being used. Generally, this only
* entails a call to {@link Bitmap#recycle()}, but it also provides a place to catch {@link Bitmap}
* instances for reuse in a cache or an object pool.
*/
public interface BitmapRecycler {
void recycleBitmap( Bitmap bitmap );
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.qozix.tileview.graphics;

import android.graphics.Bitmap;

public class BitmapRecyclerDefault implements BitmapRecycler {
@Override
public void recycleBitmap( Bitmap bitmap ) {
if( !bitmap.isRecycled() ) {
bitmap.recycle();
}
}
}
14 changes: 12 additions & 2 deletions tileview/src/main/java/com/qozix/tileview/tiles/Tile.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.qozix.tileview.detail.DetailLevel;
import com.qozix.tileview.geom.FloatMathHelper;
import com.qozix.tileview.graphics.BitmapProvider;
import com.qozix.tileview.graphics.BitmapRecycler;

import java.lang.ref.WeakReference;

Expand Down Expand Up @@ -58,6 +59,7 @@ public enum State {
private DetailLevel mDetailLevel;

private WeakReference<TileRenderRunnable> mTileRenderRunnableWeakReference;
private WeakReference<BitmapRecycler> mBitmapRecyclerReference;

public Tile( int column, int row, int width, int height, Object data, DetailLevel detailLevel ) {
mRow = row;
Expand Down Expand Up @@ -168,12 +170,17 @@ public void setState( State state ) {
}

public void execute( TileRenderPoolExecutor tileRenderPoolExecutor ) {
execute( tileRenderPoolExecutor, null );
}

public void execute( TileRenderPoolExecutor tileRenderPoolExecutor, BitmapRecycler recycler ) {
if(mState != State.UNASSIGNED){
return;
}
mState = State.PENDING_DECODE;
TileRenderRunnable runnable = new TileRenderRunnable();
mTileRenderRunnableWeakReference = new WeakReference<>( runnable );
mBitmapRecyclerReference = new WeakReference<>( recycler );
runnable.setTile( this );
runnable.setTileRenderPoolExecutor( tileRenderPoolExecutor );
tileRenderPoolExecutor.execute( runnable );
Expand Down Expand Up @@ -254,8 +261,11 @@ void reset() {
}
mState = State.UNASSIGNED;
mRenderTimeStamp = null;
if( mBitmap != null && !mBitmap.isRecycled() ) {
mBitmap.recycle();
if( mBitmap != null ) {
BitmapRecycler recycler = mBitmapRecyclerReference.get();
if( recycler != null ) {
recycler.recycleBitmap( mBitmap );
}
}
mBitmap = null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import android.view.ViewGroup;

import com.qozix.tileview.detail.DetailLevel;
import com.qozix.tileview.graphics.BitmapRecyclerDefault;
import com.qozix.tileview.graphics.BitmapRecycler;
import com.qozix.tileview.graphics.BitmapProvider;
import com.qozix.tileview.graphics.BitmapProviderAssets;

Expand All @@ -34,6 +36,7 @@ public class TileCanvasViewGroup extends ViewGroup {
private float mScale = 1;

private BitmapProvider mBitmapProvider;
private BitmapRecycler mBitmapRecycler;

private DetailLevel mDetailLevelToRender;
private DetailLevel mLastRenderedDetailLevel;
Expand Down Expand Up @@ -112,10 +115,21 @@ public BitmapProvider getBitmapProvider() {
return mBitmapProvider;
}

public BitmapRecycler getBitmapRecycler() {
if( mBitmapRecycler == null ) {
mBitmapRecycler = new BitmapRecyclerDefault();
}
return mBitmapRecycler;
}

public void setBitmapProvider( BitmapProvider bitmapProvider ) {
mBitmapProvider = bitmapProvider;
}

public void setBitmapRecycler( BitmapRecycler bitmapRecycler ) {
mBitmapRecycler = bitmapRecycler;
}

public void setTileRenderListener( TileRenderListener tileRenderListener ) {
mTileRenderListener = tileRenderListener;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void queue( TileCanvasViewGroup tileCanvasViewGroup, Set<Tile> renderSet
if( isShutdownOrTerminating() ) {
return;
}
tile.execute( this );
tile.execute( this, tileCanvasViewGroup.getBitmapRecycler() );
}
}

Expand Down

0 comments on commit ecdb013

Please sign in to comment.